home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / kob / kob001s.lzh / xbstat.has < prev    next >
Text File  |  1996-12-11  |  59KB  |  3,625 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xbstat.has  ……   ぺけ-BASICのステートメント(コンパイラ)
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.  
  9.     .include    variable.h
  10.     .include    fefunc.h
  11.  
  12.     .xref    variable_check
  13.     .xref    math解釈
  14.     .xref    error
  15.     .xref    errors
  16.     .xref    warning
  17.     .xref    warnings
  18.     .xref    function_check
  19.     .xref    one_check
  20.     .xref    int定数get
  21.     .xref    I行数算出
  22.  
  23.     .xref    malloc
  24.     .xref    buf書込
  25.     .xref    buf書込L
  26.     .xref    bufget
  27.     .xref    bufgetL
  28.     .xref    bufput
  29.  
  30.  
  31.  
  32.  
  33.  
  34.     .text
  35.     .even
  36.  
  37.     .xdef    first_check_a5
  38.  * a5 から調べ始める。
  39.  * まず、空白(9,10,13,32)を飛ばして、先頭の文字を見る。
  40.  * 数字(行番号のはず)なら    d0 = 0
  41.  * プログラム終了なら        d0 = -1
  42.  * その他なら            d0 = そのキャラクタ
  43. first_check_a5:
  44. fc_loop:
  45.     moveq    #0,d0
  46.     move.b    (a5),d0
  47.     cmpi.b    #$20,d0
  48.     bhi    fc_loop_out
  49.     beq    fc_next
  50.     cmpi.b    #9,d0
  51.     beq    fc_next
  52.     bcs    @f
  53.     cmpi.b    #$d,d0
  54.     ble    fc_crlf        * $a~$d
  55.     cmpi.b    #$1a,d0
  56.     beq    last
  57.     bra    fc_ret        * おそらく出てくるはずのない ctrl code
  58. @@:
  59.     tst.b    d0
  60.     beq    last
  61.     bra    fc_loop_out
  62. fc_crlf:
  63.     cmpi.b    #$a,d0
  64.     bne    fc_next
  65.     addq.l    #1,行数
  66.  
  67.     btst    #no_cnfF,d7
  68.     beq    fc_next        * 以下、コンフィグ読み込みには関係ない処理
  69.  
  70.     move.l    a0,-(sp)    * else 関係の処理に使うから
  71.  
  72.     move.l    a4,d0
  73.     sub.l    $c+中間言語行数,d0
  74.     move.l    a4,$c+中間言語行数
  75.  * 鎖状のバッファ(size = CbufSIZE * word )を malloc して、d0.w を書き込む
  76.  * d1.w/a0-a1 破壊
  77.     movem.l    d1/a1,-(sp)
  78.     pea.l    中間言語行数
  79.     bsr    buf書込
  80.     addq.l    #4,sp
  81.     movem.l    (sp)+,d1/a1
  82.  
  83. @@:
  84.     movea.l    nest_work,a0
  85.     tst.l    (a0)
  86.     beq    @f
  87.     cmpi.w    #3,8(a0)    * if
  88.     bne    @f
  89.     move.w    10(a0),d0
  90.     btst    #0,d0
  91.     bne    @f
  92.  
  93.     bsr    If_end        * if 文で、改行終わりの時
  94.     bra    @b    * もう一個上にあるかも
  95. @@:
  96.     move.l    (sp)+,a0
  97.  
  98.  
  99.  
  100.  * ここは行の先頭。数字が有ったら行番号だから飛ばす
  101.         addq.l    #1,a5
  102. top_line_loop:
  103.         moveq    #0,d0
  104.         move.b    (a5),d0
  105.         beq    last
  106.         cmpi.b    #32,d0
  107.         bhi    top_line_loop_out
  108.         beq    top_line_cont
  109.         cmpi.b    #9,d0
  110.         beq    top_line_cont
  111.         bcs    fc_ret
  112.         cmpi.b    #13,d0
  113.         ble    fc_crlf        * また改行
  114.         cmpi.b    #$1a,d0
  115.         beq    last
  116.         bra    fc_ret        * おそらく出てくるはずのない ctrl code
  117. top_line_cont:
  118.         addq.l    #1,a5
  119.         bra    top_line_loop
  120.  
  121.  
  122. top_line_loop_out:
  123.         cmpi.b    #'9',d0
  124.         bhi    fc_topret
  125.         cmpi.b    #'0',d0
  126.         bcs    fc_topret
  127.      * 数字だ
  128.         btst    #linenumF,d7
  129.         beq    fc_数字
  130.      * 行番号有り
  131.         move.l    a0,-(sp)
  132.         movea.l    a5,a0
  133.         FPACK    __STOL
  134.         movea.l    a0,a5
  135.         cmpi.l    #$10000,d0
  136.         bcc    不正な行番号
  137.         movem.l    d1/a1,-(sp)
  138.         pea.l    行番号
  139.         bsr    buf書込        * d1.w/a0-a1 破壊
  140.         addq.l    #4,sp
  141.         movem.l    (sp)+,d1/a1
  142.         move.l    (sp)+,a0
  143.  
  144.         move.b    (a5),d0
  145.         cmpi.b    #9,d0
  146.         beq    first_check_a5
  147.         cmpi.b    #32,d0
  148.         beq    first_check_a5
  149.         ERROR    66        * 行番号で切れてない。
  150. 不正な行番号:
  151.         ERROR    79
  152.  
  153. fc_next:
  154.     addq.l    #1,a5
  155.     bra    fc_loop
  156.  
  157.  
  158. fc_loop_out:
  159.     cmpi.b    #'9',d0
  160.     bhi    fc_ret
  161.     cmpi.b    #'0',d0
  162.     bcs    fc_ret
  163.     moveq    #0,d0
  164. fc_ret:
  165.     rts
  166.  
  167. last:
  168.     moveq    #-1,d0
  169.     rts
  170. fc_topret:
  171.     btst    #linenumF,d7
  172.     beq    fc_ret
  173.     WARN    12        * 行番号ない
  174.     rts
  175. fc_数字:
  176.     WARN    13        * 先頭数字
  177.     moveq    #0,d0
  178.     rts
  179.  
  180.  
  181.  
  182.  
  183.  
  184.     .xdef    first_check_a5_in_line
  185. first_check_a5_in_line:
  186.     moveq    #0,d0
  187. fci_loop:
  188.     move.b    (a5),d0
  189.     tst.b    _is_hash(a6,d0.w)    * 流用
  190.     bge    fci_loop_out
  191. fci_next:
  192.     addq.l    #1,a5
  193.     bra    fci_loop
  194.  
  195.  
  196. fci_loop_out:
  197.     cmpi.b    #'9',d0
  198.     bhi    fci_ret
  199.     cmpi.b    #'0',d0
  200.     bcs    fci_ret2
  201.     moveq    #0,d0
  202.     rts
  203.  
  204. fci_ret2:
  205.     cmpi.b    #$1a,d0
  206.     bhi    fci_ret
  207.     beq    lasti
  208.     cmpi.b    #$d,d0
  209.     beq    lasti
  210.     cmpi.b    #$a,d0
  211.     beq    lasti
  212.     tst.b    d0
  213.     bne    fci_ret
  214. lasti:
  215.     moveq    #-1,d0
  216. fci_ret:
  217.     rts
  218.  
  219.  
  220. first_check_a5_remark:
  221.     bsr    first_check_a5
  222.     cmpi.b    #'/',d0
  223.     bne    @f
  224.     cmpi.b    #'*',1(a5)
  225.     bne    @f
  226.     bsr    行末まで飛ばし
  227.     bra    first_check_a5_remark
  228. @@:
  229.     rts
  230.  
  231.  
  232.  * else があるかどうかチェック
  233.  * eq = ある , ne = ない
  234.     .xdef    else_check
  235. else_check:
  236.     bsr    first_check_a5_in_line
  237.     cmpi.b    #'e',(a5)
  238.     bne    @f
  239.     cmpi.b    #'l',1(a5)
  240.     bne    @f
  241.     cmpi.b    #'s',2(a5)
  242.     bne    @f
  243.     cmpi.b    #'e',3(a5)
  244. *    bne    @f
  245. *    addq.w    #4,a5
  246. @@:
  247.     rts
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.     .xdef    行末まで飛ばし
  260. 行末まで飛ばし:
  261.     move.b    (a5)+,d0
  262.     beq    @f
  263.     cmpi.b    #$a,d0
  264.     bne    行末まで飛ばし
  265. @@:
  266.     subq.l    #1,a5
  267.     rts
  268.  
  269.  
  270.  
  271.  
  272.  
  273.     .xdef    make_hash_istable
  274. make_hash_istable:
  275.     lea.l    $100+_is_hash(a6),a0
  276.     move.w    #$ff,d1
  277.     moveq    #1,d0
  278. 3:
  279.     cmpi.b    #'$',d1
  280.     beq    @f
  281.     cmpi.b    #'0',d1
  282.     bcs    2f
  283.     cmpi.b    #'9',d1
  284.     bls    @f
  285.     cmpi.b    #'A',d1
  286.     bcs    2f
  287.     cmpi.b    #'Z',d1
  288.     bls    @f
  289.     cmpi.b    #'_',d1
  290.     beq    @f
  291.     cmpi.b    #'a',d1
  292.     bcs    2f
  293.     cmpi.b    #'z',d1
  294.     bls    @f
  295.     bra    2f
  296. @@:
  297.     clr.b    -(a0)
  298.     bra    4f
  299. 2:
  300.     move.b    d0,-(a0)    * d0 = +1
  301. 4:
  302.     dbra    d1,3b
  303.  
  304. *    moveq    #-1,d1        *
  305.     move.b    d1,9(a0)
  306.     move.b    d1,32(a0)
  307.     rts
  308.  
  309.  
  310.  
  311.  * ハッシュ値を計算しながら、文字数を数える
  312.  * a2.l = 元の対象の開始アドレス
  313.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  314.  * d4.w = 文字数 - 1
  315.  * d1.b = お次の文字 (  (,[,=,:, , etc... TAB,SPC 以外 )
  316.  * ( ここに書いてあるもの以外を壊してはいけない )
  317.     .xdef    hash
  318. hash:
  319.     movea.l    a5,a2
  320.     moveq    #0,d5
  321.     moveq    #0,d1
  322.     moveq    #0,d4
  323. hloop:
  324.     move.b    (a5)+,d1
  325.     tst.b    _is_hash(a6,d1.w)
  326.     beq    @f    * 英数字、$、_
  327.     bgt    h_end
  328.     bra    h_space
  329.  
  330. @@:
  331.     rol.w    #2,d5        * ハッシュ値計算(6/11/4 現在)
  332.     eor.w    d1,d5
  333.     addq.w    #1,d4
  334.     bra    hloop
  335.  
  336. h_space:
  337.     move.b    (a5)+,d1
  338.     tst.b    _is_hash(a6,d1.w)
  339.     bmi    h_space
  340. h_end:
  341.     subq.l    #1,a5
  342.     subq.w    #1,d4
  343.     swap    d4
  344.     move.w    d5,d4
  345.     swap    d4    * (hash.w)(文字数-1)
  346.     rts
  347.  
  348.  
  349.  
  350.     .xdef    hash_label特別
  351. hash_label特別:
  352.     movea.l    a5,a2
  353.     moveq    #0,d5
  354.     moveq    #0,d1
  355.     moveq    #0,d4
  356. hloop_lt:
  357.     move.b    (a5)+,d1
  358.     cmpi.b    #'"',d1
  359.     bhi    @f
  360.     beq    h_end_lt
  361.     cmpi.b    #$20,d1
  362.     bcs    label_err
  363. @@:
  364.     rol.w    #2,d5        * ハッシュ値計算(6/11/4 現在)
  365.     eor.w    d1,d5
  366.     addq.w    #1,d4
  367.     bra    hloop_lt
  368.  
  369. h_space_lt:
  370.     move.b    (a5)+,d1
  371.     tst.b    _is_hash(a6,d1.w)
  372.     bmi    h_space_lt
  373. h_end_lt:
  374.     subq.l    #1,a5
  375.     subq.w    #1,d4
  376.     swap    d4
  377.     move.w    d5,d4
  378.     swap    d4    * (hash.w)(文字数-1)
  379.     rts
  380.  
  381. label_err:
  382.     ERROR    82
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  * (a2) から始まる名前(d4.w = 長さ - 1)を登録し、アドレスを a0 に返す。
  389.     .xdef    名前登録
  390. 名前登録:
  391.     move.w    d0,-(sp)
  392.     movea.l    名前,a0
  393.     move.w    4+名前,d0
  394. @@:
  395.     sub.w    d4,d0
  396.     subq.w    #1,d0
  397.     bge    @f
  398.     move.w    #$400,d0
  399.     bsr    malloc
  400.     bra    @b
  401. @@:
  402.  
  403.     move.l    a0,-(sp)
  404. @@:
  405.     move.b    (a2)+,(a0)+
  406.     dbra    d4,@b
  407. *    clr.b    (a0)+        * いらないけど一応気持ち
  408.     move.l    a0,名前
  409.     move.w    d0,4+名前
  410.     movea.l    (sp)+,a0
  411.     move.w    (sp)+,d0
  412.     rts
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  * 対象がどれかステートメントと一致するかどうか
  420.  * a2.l = 元の対象の開始アドレス
  421.  * d5.w = ハッシュ値
  422.  * d4.w = 文字数 - 1
  423.  
  424.  * 一致すれば        d0 = そのステートメント番号
  425.  * 一致しなければ    d0 = 0
  426.     .xdef    statement_check
  427. statement_check:
  428.     moveq    #0,d0
  429.     move.b    d5,d0    * ハッシュ値の下位バイトで見当を付ける
  430.     move.b    stat_hash_table(pc,d0.w),d0
  431.     bne    sc_本格check
  432.     rts
  433.  
  434.     * ステートメント用のハッシュ値テーブル (1対1対応)
  435. stat_hash_table:
  436.     .dc.b    $23,$00,$00,$00,$00,$00,$00,$00,$20,$00,$00,$27,$0C,$00,$0A,$00
  437.     .dc.b    $15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  438.     .dc.b    $1A,$1C,$00,$00,$00,$00,$00,$00,$00,$28,$00,$07,$00,$00,$00,$00
  439.     .dc.b    $00,$00,$00,$00,$11,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08
  440.     .dc.b    $00,$00,$00,$00,$1D,$21,$17,$00,$00,$00,$00,$00,$1F,$00,$00,$00
  441.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$24,$1B,$00,$00
  442.     .dc.b    $00,$00,$00,$00,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0E,$00
  443.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$29,$00,$00,$00,$00,$00
  444.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$22,$00,$00,$13,$00,$00,$18
  445.     .dc.b    $00,$00,$26,$00,$00,$00,$00,$00,$2a,$00,$00,$00,$00,$0D,$00,$00
  446.     .dc.b    $00,$1E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$16,$00
  447.     .dc.b    $00,$00,$00,$00,$00,$00,$25,$00,$06,$00,$00,$00,$00,$00,$00,$00
  448.     .dc.b    $00,$00,$19,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$00
  449.     .dc.b    $00,$00,$00,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$05,$04,$00,$00
  450.     .dc.b    $00,$00,$02,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  451.     .dc.b    $00,$00,$00,$12,$00,$00,$00,$0F,$00,$00,$00,$00,$00,$00,$00,$00
  452.  
  453. sc_本格check:
  454.     move.w    d0,d2
  455.     lsl.w    #2,d2
  456.     cmp.w    stat(pc,d2.w),d4
  457.     bne    sc_該当無し
  458.     move.w    2+stat(pc,d2.w),d2
  459.     lea.l    stat(pc,d2.w),a0
  460.     move.l    a2,a1
  461.     move.w    d4,d2
  462. @@:
  463.     cmp.b    (a1)+,(a0)+
  464.     dbne    d2,@b
  465.     beq    sc_ok
  466. sc_該当無し:
  467.     moveq    #0,d0
  468. sc_ok:
  469.     rts
  470.  
  471. stat:
  472.     .dc.w    s01-s00-2,s00-stat    * dummy
  473.     .dc.w    s02-s01-2,s01-stat
  474.     .dc.w    s03-s02-2,s02-stat
  475.     .dc.w    s04-s03-2,s03-stat
  476.     .dc.w    s05-s04-2,s04-stat
  477.     .dc.w    s06-s05-2,s05-stat
  478.     .dc.w    s07-s06-2,s06-stat
  479.     .dc.w    s08-s07-2,s07-stat
  480.     .dc.w    s09-s08-2,s08-stat
  481.     .dc.w    s10-s09-2,s09-stat
  482.     .dc.w    s11-s10-2,s10-stat
  483.     .dc.w    s12-s11-2,s11-stat
  484.     .dc.w    s13-s12-2,s12-stat
  485.     .dc.w    s14-s13-2,s13-stat
  486.     .dc.w    s15-s14-2,s14-stat
  487.     .dc.w    s16-s15-2,s15-stat
  488.     .dc.w    s17-s16-2,s16-stat
  489.     .dc.w    s18-s17-2,s17-stat
  490.     .dc.w    s19-s18-2,s18-stat
  491.     .dc.w    s20-s19-2,s19-stat
  492.     .dc.w    s21-s20-2,s20-stat
  493.     .dc.w    s22-s21-2,s21-stat
  494.     .dc.w    s23-s22-2,s22-stat
  495.     .dc.w    s24-s23-2,s23-stat
  496.     .dc.w    s25-s24-2,s24-stat
  497.     .dc.w    s26-s25-2,s25-stat
  498.     .dc.w    s27-s26-2,s26-stat
  499.     .dc.w    s28-s27-2,s27-stat
  500.     .dc.w    s29-s28-2,s28-stat
  501.     .dc.w    s30-s29-2,s29-stat
  502.     .dc.w    s31-s30-2,s30-stat
  503.     .dc.w    s32-s31-2,s31-stat
  504.     .dc.w    s33-s32-2,s32-stat
  505.     .dc.w    s34-s33-2,s33-stat
  506.     .dc.w    s35-s34-2,s34-stat
  507.     .dc.w    s36-s35-2,s35-stat
  508.     .dc.w    s37-s36-2,s36-stat
  509.     .dc.w    s38-s37-2,s37-stat
  510.     .dc.w    s39-s38-2,s38-stat
  511.     .dc.w    s40-s39-2,s39-stat
  512.     .dc.w    s41-s40-2,s40-stat
  513.     .dc.w    s42-s41-2,s41-stat
  514.     .dc.w    s43-s42-2,s42-stat
  515.  
  516.  
  517.  
  518. st:
  519. * ステートメント
  520. s00:    *dummy
  521. s01:    .dc.b    'color',0
  522. s02:    .dc.b    'console',0
  523. s03:    .dc.b    'locate',0
  524. s04:    .dc.b    'lprint',0
  525. s05:    .dc.b    'print',0
  526. s06:    .dc.b    'width',0
  527. s07:    .dc.b    'screen',0
  528.  
  529. s08:    .dc.b    'break',0
  530. s09:    .dc.b    'case',0
  531. s10:    .dc.b    'continue',0
  532. s11:    .dc.b    'default',0
  533. s12:    .dc.b    'endfunc',0
  534. s13:    .dc.b    'endswitch',0
  535. s14:    .dc.b    'error',0
  536. s15:    .dc.b    'return',0
  537. s16:    .dc.b    'switch',0
  538. s17:    .dc.b    'beep',0
  539. s18:    .dc.b    'cls',0
  540. s19:    .dc.b    'end',0
  541. s20:    .dc.b    'endwhile',0
  542. s21:    .dc.b    'exit',0
  543. s22:    .dc.b    'for',0
  544. s23:    .dc.b    'gosub',0
  545. s24:    .dc.b    'goto',0
  546. s25:    .dc.b    'if',0
  547. s26:    .dc.b    'input',0
  548. s27:    .dc.b    'key',0
  549. s28:    .dc.b    'linput',0
  550. s29:    .dc.b    'next',0
  551. s30:    .dc.b    'repeat',0
  552. s31:    .dc.b    'stop',0
  553. s32:    .dc.b    'until',0
  554. s33:    .dc.b    'while',0
  555.  
  556. s34:    .dc.b    'dim',0
  557. s35:    .dc.b    'float',0
  558. s36:    .dc.b    'int',0
  559. s37:    .dc.b    'char',0
  560. s38:    .dc.b    'str',0
  561.  
  562. s39:    .dc.b    'func',0
  563.  
  564. s40:    .dc.b    'else',0
  565. s41:    .dc.b    'then',0
  566. s42:    .dc.b    'label',0
  567. s43:
  568.     .dc.b    0
  569.     .even
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  * 各ステートメントごとに文法が違うのでいちいち異なる解釈をしなければ
  576.  * d0 = statment #.
  577.     .xdef    stat解釈
  578. stat解釈:
  579.     move.w    d0,d2
  580.     add.w    d2,d2
  581.     move.w    stt(pc,d2.w),d0
  582.     jmp    stt(pc,d0.w)
  583. stt:
  584.     .dc.w    0        * dummy
  585.     .dc.w    Color-stt
  586.     .dc.w    Console-stt
  587.     .dc.w    Locate-stt
  588.     .dc.w    Lprint-stt
  589.     .dc.w    Print-stt
  590.     .dc.w    Width-stt
  591.     .dc.w    Screen-stt
  592.     .dc.w    Break-stt
  593.     .dc.w    Case-stt
  594.     .dc.w    Continue-stt        *10
  595.     .dc.w    Default-stt
  596.     .dc.w    Endfunc-stt
  597.     .dc.w    Endswitch-stt
  598.     .dc.w    Error-stt
  599.     .dc.w    Return-stt
  600.     .dc.w    Switch-stt
  601.     .dc.w    Beep-stt
  602.     .dc.w    Cls-stt
  603.     .dc.w    End-stt
  604.     .dc.w    Endwhile-stt        *20
  605.     .dc.w    Exit-stt
  606.     .dc.w    For-stt
  607.     .dc.w    Gosub-stt
  608.     .dc.w    Goto-stt
  609.     .dc.w    If-stt
  610.     .dc.w    Input-stt
  611.     .dc.w    Key-stt
  612.     .dc.w    Linput-stt
  613.     .dc.w    Next-stt
  614.     .dc.w    Repeat-stt        *30
  615.     .dc.w    Stop-stt
  616.     .dc.w    Until-stt
  617.     .dc.w    While-stt
  618.     .dc.w    Dim-stt
  619.     .dc.w    Float-stt    * 35
  620.     .dc.w    Int-stt
  621.     .dc.w    Char-stt
  622.     .dc.w    Str-stt
  623.     .dc.w    Func-stt
  624.     .dc.w    Else-stt        *40
  625.     .dc.w    Then-stt
  626.  
  627.  
  628.  
  629.  
  630. Gosub:
  631.     ERRORS    3    * 未サポート
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638. Goto:
  639.     move.w    d2,(a4)+        * 中間言語書き込み
  640.  
  641.     pea.l    goto飛先
  642.  
  643.     move.b    (a5),d0
  644.     cmpi.b    #'9',d0
  645.     bhi    goto_err
  646.     cmpi.b    #'0',d0
  647.     bcc    Goto番号
  648.     btst    #labelF,d7
  649.     beq    goto_err
  650.     cmpi.b    #'"',d0
  651.     beq    label_quote
  652.     cmpi.b    #'*',d0
  653.     bne    goto_err
  654.  
  655. label_star:
  656.     addq.l    #1,a5
  657.     bsr    hash
  658.     bsr    label_sub    * d0 = label #
  659.     not.l    d0
  660.     bsr    buf書込L
  661.     bra    @f
  662. label_quote:
  663.     addq.l    #1,a5
  664.     bsr    hash_label特別
  665.     bsr    label_sub    * d0 = label #
  666.     cmpi.b    #'"',(a5)+
  667.     bne    label_quote_err
  668.     not.l    d0
  669.     bsr    buf書込L
  670.     bra    @f
  671. label_quote_err:
  672.     ERROR    82
  673.  
  674. Goto番号:
  675.         btst    #linenumF,d7
  676.         beq    行番号無しにgoto
  677.         movea.l    a5,a0
  678.         FPACK    __STOL            * 行番号
  679.         movea.l    a0,a5
  680.         cmpi.l    #$10000,d0
  681.         bcc    不正な行番号
  682.         bsr    buf書込L
  683. @@:
  684.     move.l    a4,d0            * 飛び先書き込みアドレス
  685.     bsr    buf書込L        * d1.w/a0-a1 破壊
  686. *    addq.l    #4,a4
  687.     move.l    #4,(a4)+        * とりあえず安全策
  688.  
  689.     addq.l    #4,sp
  690.     rts
  691.  
  692. 行番号無しにgoto:
  693.     ERROR    78
  694. goto_err:
  695.     ERROR    80
  696.  
  697.  
  698.  
  699.  
  700.     .xdef    label_sub
  701. label_sub:
  702. *    bsr    hash
  703.     bsr    label_check
  704.     tst.w    d1
  705.     bge    1f
  706.         move.w    8+ラベル,d1
  707.         addq.w    #1,d1
  708.         lsr.w    #3,d1        * label 番号
  709.  
  710.         move.l    d1,-(sp)
  711.         pea.l    ラベル
  712.         move.l    d4,d0
  713.         bsr    buf書込L
  714.         bsr    名前登録    * a2,d4 破壊
  715.         move.l    a0,d0        * 名前アドレス
  716.         bsr    buf書込L
  717.         moveq    #-1,d0
  718.         bsr    buf書込L    * 行数(-1 = 未登録)
  719.         bsr    buf書込L    * (空き)
  720.         addq.l    #4,sp
  721.         move.l    (sp)+,d1
  722. 1:
  723.     moveq    #0,d0
  724.     move.w    d1,d0
  725.     rts
  726.  
  727.  
  728.  
  729. label_check:
  730.     move.w    8+ラベル,d3
  731.     addq.w    #1,d3
  732.     lsr.w    #3,d3        * label 個数
  733.     subq.w    #1,d3
  734.     bmi    label_check_end
  735.     movea.l    4+ラベル,a3
  736.     moveq    #CbufSIZE/8,d2
  737.     moveq    #0,d1
  738. label_check_loop:
  739.     cmp.l    (a3),d4
  740.     bne    label_check_cont
  741.         movea.l    4(a3),a0    * 名前
  742.         movea.l    a2,a1
  743.         move.w    d4,d0
  744. @@:
  745.         cmp.b    (a0)+,(a1)+
  746.         dbne    d0,@b
  747.         beq    label_check_ok
  748.  
  749. label_check_cont:
  750.     lea.l    $10(a3),a3
  751.     addq.w    #1,d1
  752.     subq.w    #1,d2
  753.     dbeq    d3,label_check_loop
  754.     bne    label_check_end
  755.     movea.l    (a3),a3
  756.     moveq    #CbufSIZE/8,d2
  757.     dbra    d3,label_check_loop
  758. label_check_end:
  759.     moveq    #-1,d1
  760. label_check_ok:
  761.     rts
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.     .xdef    Goto整理
  770. Goto整理:
  771.     movem.l    d0-d4/a0-a3,-(sp)
  772.  
  773.     move.w    8+goto飛先,d4
  774.     addq.w    #1,d4
  775.     lsr.w    #2,d4        * goto 文の個数
  776.     subq.w    #1,d4
  777.     bmi    Goto整理_end
  778.     movea.l    4+goto飛先,a3
  779.     moveq    #CbufSIZE/4,d3
  780. Goto整理_loop:
  781.     move.l    (a3)+,d2    * 行番号
  782.     bge    @f
  783.     not.l    d2        * ラベル番号
  784.     move.w    d2,d1
  785.     lsl.w    #3,d1
  786.     addq.w    #4,d1        * 行数の格納位置
  787.  
  788.     move.l    a3,-(sp)
  789.     movea.l    4+ラベル,a3
  790.     bsr    bufgetL        * ラベルのさすアドレス
  791.     move.l    (sp)+,a3
  792.     movea.l    d0,a1
  793.     bra    1f
  794. @@:
  795.     bsr    行番号to行数
  796.     tst.w    d1
  797.     bmi    行番号該当無し
  798.     bsr    行数toADDRESS
  799. 1:
  800.     movea.l    (a3)+,a0    * 飛び先書き込みアドレス
  801.     bsr    goto_block_check
  802.     suba.l    a0,a1
  803.     move.l    a1,(a0)
  804.  
  805.     subq.w    #1,d3
  806.     dbeq    d4,Goto整理_loop
  807.     bne    Goto整理_end
  808.     movea.l    (a3),a3
  809.     moveq    #CbufSIZE/4,d3
  810.     dbra    d4,Goto整理_loop
  811.  
  812. Goto整理_end:
  813.     movem.l    (sp)+,d0-d4/a0-a3
  814.     rts
  815.  
  816. 行番号該当無し:
  817.     movea.l    (a3)+,a5    * 飛び先書き込みアドレス
  818.     bsr    I行数算出
  819.     ERROR    78
  820.  
  821.  
  822.  * goto=a0 と 飛び先=a1 の間に func がないかどうか
  823. goto_block_check:
  824.     movem.l    d5/a0/a1/a3,-(sp)
  825.     move.w    内部関数個数,d5
  826.     bmi    1f
  827.     movea.l    内部関数buf,a3
  828.     cmpa.l    a1,a0
  829.     bcs    @f
  830.     exg    a0,a1        * a0<a1
  831.  
  832. @@:
  833.     lea.l    $c(a3),a3
  834.     move.l    (a3)+,d0    * func
  835.     cmp.l    a1,d0
  836.     bcc    1f
  837.     cmp.l    a0,d0
  838.     bcc    2f
  839.     dbra    d5,@b
  840. 1:
  841.     movem.l    (sp)+,d5/a0/a1/a3
  842.     rts
  843. 2:
  844.     movem.l    (sp)+,d5/a0/a1/a3
  845.     movea.l    a0,a5        * 飛び先書き込みアドレス
  846.     bsr    I行数算出
  847.     ERROR    83    * 関数ブロックの外に飛び出した
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  * d1 = 行数 ( 1,2,3,...) to  a1 = ADDRESS
  855. 行数toADDRESS:
  856.     movem.l    d3/a3,-(sp)
  857.     move.w    d1,d3
  858.     subq.w    #1,d3
  859.     moveq    #0,d1
  860.     movea.l    4+中間言語行数,a3
  861.     move.l    中間言語,a1
  862. @@:
  863.     bsr    bufget
  864.     adda.w    d0,a1
  865.     addq.w    #1,d1
  866.     dbra    d3,@b
  867.     movem.l    (sp)+,d3/a3
  868.     rts
  869.  
  870.  
  871.  * d2 = 行番号  to  d1 = 行数 ( 1,2,3,...), =-1 なし
  872. 行番号to行数:
  873.     movem.l    d3/a3,-(sp)
  874.     moveq    #0,d1
  875.     move.w    8+行番号,d3
  876.     movea.l    4+行番号,a3
  877. @@:
  878.     bsr    bufget
  879.     addq.w    #1,d1
  880.     cmp.w    d2,d0
  881.     dbeq    d3,@b
  882.     beq    @f
  883.     moveq    #-1,d1
  884. @@:
  885.     movem.l    (sp)+,d3/a3
  886.     rts
  887.  
  888.  
  889.  
  890.  
  891.  
  892. **    **    **
  893.  *    内部関数関係のステートメントの処理
  894.  
  895.  
  896.     .xdef    Return
  897. Return:
  898.     tst.b    d7
  899.     bpl    funcがない
  900.  
  901.     cmpi.b    #'(',(a5)
  902.     bne    _no_ret_dat2
  903.  
  904.     addq.l    #1,a5
  905.     bsr    first_check_a5_in_line
  906.     cmpi.b    #')',d0
  907.     beq    _no_ret_dat
  908.  
  909.     move.w    d2,(a4)+        * 中間言語書き込み
  910.  
  911.     move.w    RETURNtype,d2
  912.     move.w    d2,(a4)+        * 中間言語書き込み
  913.  
  914.     lsl.w    #8,d2
  915.     movea.l    a4,a3
  916.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  917.  * int        d2.w    = 0000
  918.  * str        d2.w    = 0100
  919.  * float    d2.w    = 8000
  920.     bsr    math解釈
  921.     movea.l    a3,a4
  922.  
  923.     cmpi.b    #')',(a5)+
  924.     bne    err_return
  925.     rts
  926.  
  927. err_return:
  928.     ERROR    50
  929.  
  930. _no_ret_dat:
  931.     addq.l    #1,a5
  932. _no_ret_dat2:
  933.     tst.w    RETURNtype
  934.     bne    返り値がない
  935.     move.w    #$0c*2,(a4)+        * 中間言語書き込み'endfunc'$$$
  936.     clr.w    (a4)+            * 中間言語書き込み (int)
  937.     rts
  938.  
  939. 返り値がない:
  940.     ERROR    49
  941.  
  942.  
  943. Endfunc:
  944.     tst.b    d7
  945.     bpl    funcがない
  946.     bset    #endfuncF,d7
  947.     bne    funcがない
  948.  
  949.     movea.l    nest_work,a0
  950.     tst.l    (a0)
  951.     bne    nest_structure終わってない
  952.  
  953.     move.w    d2,(a4)+        * 中間言語書き込み
  954.     move.w    RETURNtype,(a4)+
  955.  
  956.     bsr    auto変数リスト作成
  957.     rts
  958.  
  959. funcがない:
  960.     ERROR    45
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967.     .xdef    Func
  968. Func:
  969.     bset    #modeF,d7        * auto
  970.     bne    内部関数あり
  971.  
  972.  * global
  973.     movea.l    nest_work,a0
  974.     tst.l    (a0)
  975.     bne    nest_structure終わってない
  976.  
  977.     move.w    d2,(a4)+        * 中間言語書き込み
  978.     bsr    global変数リスト作成
  979.     bra    @f
  980.  
  981. 内部関数あり:
  982.     bclr    #endfuncF,d7
  983.     beq    no_endfunc
  984. @@:
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  * 型を得る(省略なら int )
  991.     bsr    型get            * すでにわかっている(はず)
  992.  
  993.     bsr    first_check_a5_in_line
  994.  * ハッシュ値を計算しながら、文字数を数える
  995.     bsr    hash
  996.  * a2.l = 元の対象の開始アドレス
  997.  * d4.l = (hash.w)(文字数-1)
  998.     tst.w    d4
  999.     bmi    sonnahazunai
  1000.     movem.l    d4/a2,-(sp)        * システム関数チェックに使用
  1001.     bsr    function_check
  1002.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  1003.  * d0.w < 0 の時
  1004.  *    d1.w = 引き数の個数
  1005.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数 )
  1006.  *    a2   = パラメーターテーブル
  1007.     tst.w    d0
  1008.     beq    sonnahazunai
  1009.     not.w    d3
  1010.     bmi    sonnahazunai
  1011.  
  1012.     .xref    sysfunc_check
  1013.     bsr    sysfunc_check        * システム変数かどうかチェックして登録。
  1014.     addq.l    #8,sp
  1015.  
  1016.     lsl.w    #4,d3
  1017.     movea.l    内部関数buf,a3
  1018.     adda.w    d3,a3
  1019.     move.l    a4,$c(a3)        * 実行アドレス
  1020.  
  1021.  
  1022. *    movem.l    変数INIT,a0/a1
  1023. *    sub.l    a1,a0
  1024.     move.w    8+変数INIT,d0
  1025.     addq.w    #1,d0
  1026.     add.w    d0,d0
  1027.     move.w    d0,(a4)+    * 変数 area を初期化する時の参照するオフセット
  1028.     move.w    8+引数INIT,d0
  1029.     addq.w    #1,d0
  1030.     add.w    d0,d0
  1031.     move.w    d0,(a4)+    * 引き数を取り込む時、参照するオフセット
  1032.  
  1033. *    movea.l    引数INIT,a1
  1034. *    subq.w    #1,d1
  1035. *    move.w    d1,(a1)+
  1036. *    move.l    a1,引数INIT
  1037.     pea.l    引数INIT
  1038.     move.w    d1,d0
  1039.     subq.w    #1,d0        * 引き数の個数 - 1
  1040.     bsr    buf書込        * d1.w/a0-a1 破壊
  1041.     addq.l    #4,sp
  1042.  
  1043.  
  1044.  
  1045.  
  1046.     moveq    #-1,d0        * 登録された個数 - 1
  1047.     move.w    d0,4+AUTOint
  1048.     move.w    d0,4+AUTOstr
  1049.     move.w    d0,4+AUTOchar
  1050.     move.w    d0,4+AUTOfloat
  1051.     move.w    d0,4+AUTO配列
  1052.  
  1053.  
  1054.     cmpi.b    #'(',(a5)+
  1055.     bne    sonnahazunai
  1056.  
  1057. func_loop:
  1058.     bsr    first_check_a5_in_line
  1059.     move.w    (a2)+,d0
  1060.     bge    @f
  1061.     cmpi.w    #$8080,d0    * 拡張配列印
  1062.     bne    func_loop_end
  1063. @@:
  1064.     move.l    a2,-(sp)
  1065.     move.w    d0,-(sp)
  1066.  
  1067.  
  1068.  * 引き数名のチェック
  1069.     bsr    hash        * 引き数名
  1070.     bsr    statement_check
  1071.     tst.w    d0
  1072.     bne    var_def_err
  1073.  
  1074.  *        d4.l = * (hash.w)(文字数-1)
  1075.  *        a2.l = 元の対象の開始アドレス
  1076.     bsr    function_check
  1077.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  1078.     tst.w    d0
  1079.     bne    var_double_def_err    * 関数と同じ名前
  1080.  
  1081.  
  1082.  * 他の変数名と重なってないかどうか
  1083.  *         d4.l = * (hash.w)(文字数-1)
  1084.  *         a2.l = 元の対象の開始アドレス
  1085.      bsr    variable_check
  1086.  * 重なってない        d2.l    = -1
  1087.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  1088.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  1089.  * char の n 番と一致    d2.l    = n+0200
  1090.  * float の n 番と一致    d2.l    = n+8000
  1091.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  1092.  * d0 =   0 : 普通の変数
  1093.  *      1 : 配列    ( a0 = その配列情報のポインタ )
  1094.  *    $80 : auto 変数
  1095.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ )
  1096.  *     -1 : 当たりなし
  1097.     bmi    @f        * 当たりなし、global のみのとき定義出来る
  1098.     tst.b    d0
  1099.     bmi    var_double_def_err
  1100.  
  1101. @@:
  1102.     move.w    (sp)+,d2        * 型
  1103.     cmpi.w    #$8080,d2    * 拡張配列印
  1104.     beq    2f
  1105.     moveq    #$60,d0        * 配列印
  1106.     and.w    d2,d0
  1107.     beq    @f
  1108. 2:
  1109.         bsr    配列引き数登録
  1110.         bra    1f
  1111. @@:
  1112.         bsr    変数引き数登録
  1113. 1:
  1114.  
  1115.     cmpi.b    #';',(a5)
  1116.     bne    @f
  1117.  
  1118.     addq.l    #1,a5
  1119.     bsr    hash        * 変数の型だが、無視
  1120. @@:
  1121.     movea.l    (sp)+,a2
  1122.  
  1123.     bsr    first_check_a5_in_line
  1124.     addq.l    #1,a5
  1125.     cmpi.b    #',',d0
  1126.     beq    func_loop
  1127.     cmpi.b    #')',d0
  1128.     bne    sonnahazunai
  1129.     move.w    (a2)+,d0
  1130.     bge    sonnahazunai
  1131.     bra    @f
  1132.  
  1133. func_loop_end:
  1134.     cmpi.b    #')',(a5)+
  1135.     bne    sonnahazunai
  1136.  
  1137.  
  1138. @@:
  1139.     subi.w    #$8000,d0
  1140.     beq    float_rt
  1141.     subq.w    #1,d0
  1142.     beq    int_rt
  1143.     subq.w    #1,d0
  1144.     beq    char_rt
  1145.     subq.w    #1,d0
  1146.     bne    sonnahazunai
  1147.     moveq    #1,d0
  1148.     bra    @f
  1149. float_rt:
  1150.     move.w    #$0080,d0
  1151.     bra    @f
  1152. char_rt:
  1153.     moveq    #$0002,d0
  1154.     bra    @f
  1155. int_rt:
  1156. @@:
  1157.     move.w    d0,RETURNtype         * d0 = 返り値の型
  1158.  
  1159.     rts
  1160.  
  1161.  
  1162. 配列引き数登録:
  1163.     move.w    d2,-(sp)
  1164.     lea.l    AUTO配列,a0    * 当たり前だが auto
  1165.     moveq    #5,d1        * 一項辺りのデータサイズ ( = 2^5 = 32 )
  1166.     bsr    変数登録sub    * 配列登録 (d2= -変数番号) (d4もういらない)
  1167.  
  1168.     move.w    (sp)+,d0    * 型
  1169.     cmpi.w    #$8080,d0
  1170.     bne    @f
  1171.  
  1172.     movea.l    4(sp),a0    * 引き数情報ポインタ
  1173.     move.w    (a0)+,d0    * 型+次元-1
  1174.     clr.w    d1
  1175.     move.b    d0,d1
  1176.     clr.b    d0
  1177.     move.w    d1,d4
  1178.     add.w    d4,d4
  1179.     lea.l    4(a0,d4.w),a0
  1180.     move.l    a0,4(sp)
  1181.     bra    1f
  1182.  
  1183. @@:
  1184.     moveq    #0,d1    * 1-dim
  1185.     btst    #6,d0
  1186.     beq    @f
  1187.     moveq    #1,d1    * 2-dim
  1188. @@:
  1189.     btst    #0,d0
  1190.     bne    float引き数D
  1191.     btst    #1,d0
  1192.     bne    int引き数D
  1193.     btst    #2,d0
  1194.     bne    char引き数D
  1195.     btst    #3,d0
  1196.     bne    str引き数D
  1197.     bra    sonnahazunai
  1198.  
  1199. float引き数D:
  1200.     move.w    #$8000,d0
  1201.     bra    1f
  1202. char引き数D:
  1203.     move.w    #$0200,d0
  1204.     bra    1f
  1205. str引き数D:
  1206.     move.w    #$0100,d0
  1207.     bra    1f
  1208. int引き数D:
  1209.     move.w    #$0000,d0
  1210.  
  1211. 1:
  1212.     move.w    d0,(a3)+    * 型
  1213.     move.w    d1,(a3)+    * 次元 - 1
  1214.     move.w    d1,-(sp)
  1215.     subq.w    #1,d1
  1216.     bcs    2f
  1217. 3:
  1218.     cmpi.b    #',',(a5)+
  1219.     bne    3b
  1220.     clr.w    (a3)+        * 変数領域大きさ計算用に添字大きさクリア
  1221.     dbra    d1,3b
  1222. 2:
  1223.     clr.w    (a3)+        * 変数領域大きさ計算用に添字大きさクリア
  1224.     cmpi.b    #')',(a5)+
  1225.     bne    2b
  1226.  
  1227.  
  1228.     move.w    (sp)+,d0    * とりあえず次元を書き込むことになっているが、
  1229.                 * 実は正の数なら何でも良い(7/5/3現在)
  1230.     pea.l    引数INIT
  1231.     bsr    buf書込        * d1.w/a0-a1 破壊
  1232.     not.w    d2
  1233.     move.w    d2,d0            * 変数番号
  1234.     bsr    buf書込        * d1.w/a0-a1 破壊
  1235.     addq.l    #4,sp
  1236.     rts
  1237.  
  1238.  
  1239.  
  1240. 変数引き数登録:
  1241.     btst    #0,d2
  1242.     bne    float引き数
  1243.     btst    #1,d2
  1244.     bne    int引き数
  1245.     btst    #2,d2
  1246.     bne    char引き数
  1247.     btst    #3,d2
  1248.     bne    str引き数
  1249.     bra    sonnahazunai
  1250.  
  1251. float引き数:
  1252.     lea.l    AUTOfloat,a0
  1253.     move.w    #$8080,d0
  1254.     bra    @f
  1255. char引き数:
  1256.     lea.l    AUTOchar,a0
  1257.     move.w    #$8002,d0
  1258.     bra    @f
  1259. str引き数:
  1260.     lea.l    AUTOstr,a0
  1261.     move.w    #$8001,d0
  1262.     bra    @f
  1263. int引き数:
  1264.     lea.l    AUTOint,a0
  1265.     move.w    #$8000,d0
  1266.  
  1267. @@:
  1268.     move.w    d0,-(sp)
  1269.     bsr    普通変数登録
  1270.  
  1271.     move.w    (sp)+,d0        * 型
  1272.     pea.l    引数INIT
  1273.     bsr    buf書込        * d1.w/a0-a1 破壊
  1274.     not.w    d2
  1275.     move.w    d2,d0            * 変数番号
  1276.     bsr    buf書込        * d1.w/a0-a1 破壊
  1277.     addq.l    #4,sp
  1278.     rts
  1279.  
  1280.  
  1281.  
  1282. sonnahazunai:
  1283.     ERROR    2
  1284. nest_structure終わってない:
  1285.     ERROR    42
  1286. no_endfunc:
  1287.     ERROR    43
  1288.  
  1289.  
  1290.  
  1291.  
  1292.     .xdef    global変数リスト作成
  1293. global変数リスト作成:
  1294.     lea.l    変数int,a2
  1295.     bra    @f
  1296.  
  1297. auto変数リスト作成:
  1298.     lea.l    AUTOint,a2
  1299. @@:
  1300.     move.w    8+変数INIT,-(sp)
  1301.     pea.l    変数INIT
  1302.  
  1303.     moveq    #0,d5        * 変数領域のサイズ
  1304.     bsr    buf書込        * dummy
  1305.     bsr    buf書込        * dummy
  1306.  
  1307.     move.w    4+8*0(a2),d0        * intの型の変数の個数 - 1
  1308.     move.w    d0,d1
  1309.     addq.w    #1,d1
  1310.     lsl.w    #2,d1
  1311.     add.w    d1,d5
  1312.     bsr    buf書込
  1313.     move.w    4+8*1(a2),d0        * str
  1314.     move.w    d0,d1
  1315.     addq.w    #1,d1
  1316.     lsl.w    #8,d1
  1317.     add.w    d1,d5
  1318.     bsr    buf書込
  1319.     move.w    4+8*2(a2),d0        * char
  1320.     move.w    d0,d1
  1321.     addq.w    #1,d1
  1322.     add.w    d1,d5
  1323.     bsr    buf書込
  1324.     move.w    4+8*3(a2),d0        * float
  1325.     move.w    d0,d1
  1326.     addq.w    #1,d1
  1327.     lsl.w    #3,d1
  1328.     add.w    d1,d5
  1329.     bsr    buf書込
  1330.  
  1331.     movea.l    0+8*4(a2),a3        * 配列まとめ
  1332.     move.w    4+8*4(a2),d4
  1333.  
  1334.     move.w    d4,d0
  1335.     bsr    buf書込        * d1.w/a0-a1 破壊
  1336.     tst.w    d4
  1337.     bmi    変数INITdata処理終了
  1338.     moveq    #変数個数,d3
  1339. 変数INITdata処理loop:
  1340.     lea.l    8(a3),a2
  1341.  
  1342.     move.w    (a2)+,d0        * 型(上位バイト)
  1343.     move.w    (a2)+,d2        * 次元 - 1
  1344.     move.b    d2,d0
  1345.     ror.w    #8,d0            * 次元+型
  1346.     bsr    buf書込        * d1.w/a0-a1 破壊
  1347.  
  1348.     moveq    #4,d1
  1349.     tst.b    d0
  1350.     beq    3f
  1351.     bmi    2f
  1352.     subq.b    #1,d0
  1353.     beq    1f
  1354.     moveq    #1,d1
  1355.     bra    3f
  1356. 1:
  1357.     move.w    #$100,d1    * 上位ワードはクリア済み
  1358.     bra    3f
  1359. 2:
  1360.     moveq    #8,d1
  1361. 3:
  1362.  
  1363. @@:
  1364.     moveq    #0,d0
  1365.     move.w    (a2)+,d0    * 添え字の大きさ
  1366.     move.l    d1,tmp        * 保存(スタックをいじれないから)
  1367.     bsr    buf書込        * d1.w/a0-a1 破壊
  1368.     move.l    tmp,d1
  1369.     addq.l    #1,d0        * 要るはず
  1370.     FPACK    __LMUL
  1371.     move.l    d0,d1
  1372.     dbra    d2,@b
  1373.     add.l    d1,d5
  1374.  
  1375.     lea.l    $20(a3),a3
  1376.     subq.w    #1,d3
  1377.     dbeq    d4,変数INITdata処理loop
  1378.     bne    変数INITdata処理終了
  1379.     moveq    #変数個数,d3
  1380.     movea.l    (a3),a3
  1381.     dbra    d4,変数INITdata処理loop
  1382.  
  1383. 変数INITdata処理終了:
  1384. *    move.l    a0,変数INIT
  1385.     addq.l    #4,sp
  1386.  
  1387.     move.w    (sp)+,d1
  1388.     move.l    d5,d2        * この関数ブロックで使用する変数領域の大きさ
  1389.  
  1390.     movea.l    4+変数INIT,a3
  1391.     swap    d2
  1392.     addq.w    #1,d1
  1393.     bsr    bufput
  1394.     swap    d2
  1395.     addq.w    #1,d1
  1396.     bsr    bufput
  1397.  
  1398.     rts
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413. **    **    **
  1414.  *    ネスト構造を持つステートメントの処理
  1415.  
  1416.  
  1417.  
  1418.  * nest 登録
  1419.  * d2.w = 登録する種類
  1420.  *    $0000 = for
  1421.  *    $ffff = while
  1422.  *    $0001 = switch
  1423.  *    $0011 = switch (default の後)
  1424.  *    $0002 = repeat
  1425.  *    $0003 = if
  1426.  *    $0004 = switch(str)
  1427.  *    $0014 = switch(str) (default の後)
  1428. nest登録:
  1429.  *    a3 = 書き込みアドレス
  1430.     movea.l    nest_work,a3
  1431.     move.l    (a3),d0
  1432.     beq    @f
  1433.     exg    a3,d0        * a3 = 今のブロックのポインタ
  1434.                 * d0 = 前のブロックのポインタ ( first block なら 0 )
  1435. @@:
  1436.     move.l    a3,nest_work
  1437.     addq.l    #4,a3        * つぎ
  1438.     move.l    d0,(a3)+    * まえ
  1439.     move.w    d2,(a3)+    * 種類
  1440.     rts
  1441.  
  1442.  * nest 
  1443. nest削除:
  1444.     movea.l    nest_work,a0
  1445.     tst.l    4(a0)
  1446.     beq    @f
  1447.     move.l    4(a0),nest_work        * 前のブロックを指すアドレス
  1448.     rts
  1449. @@:
  1450.     clr.l    (a0)
  1451.     rts
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459. Switch:
  1460.     move.w    d2,(a4)+    * 中間言語書き込み
  1461.  
  1462.     movea.l    a4,a3
  1463.     moveq    #-1,d2
  1464.     bsr    math解釈
  1465.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  1466.  * int        d6.w    = 0000
  1467.  * str        d6.w    = 0100
  1468.  * char     d6.w    = 0200
  1469.  * float    d6.w    = 8000
  1470.  
  1471.     moveq    #1,d2
  1472.  *    $0001 = switch
  1473.     cmpi.w    #$0100,d6        * str
  1474.     bne    @f
  1475.  
  1476. Switch2:
  1477.     move.w    #13*2,-2(a4)    * 中間言語書き込み $$$13='Endswitch'='Switch2'
  1478.     moveq    #4,d2
  1479.  *    $0004 = switch(str)
  1480.  
  1481. @@:
  1482.     movea.l    a3,a4
  1483.  * nest 登録
  1484.  * d2.w = 登録する種類
  1485.     bsr    nest登録
  1486.  *    a3 = 書き込みアドレス
  1487.  
  1488.     move.l    a4,(a3)+    * 飛び先を書くアドレス ( case default のリストがあるんだよ )
  1489.     addq.l    #4,a4
  1490.  
  1491.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1492.     move.l    a3,(a0)
  1493.  
  1494.     rts
  1495.  
  1496.  
  1497.  
  1498.  
  1499.  
  1500. Case:
  1501.     movea.l    nest_work,a0
  1502.     move.l    (a0),d0
  1503.     beq    no_nest_structure
  1504.  
  1505.     movea.l    d0,a3
  1506.     move.l    a4,d0
  1507.     bset    #$1d,d0        * CASE :
  1508.     move.l    d0,(a3)+    * case address
  1509.  
  1510.  *    $0001 = switch
  1511.  *    $0004 = switch(str)
  1512.     move.w    8(a0),d1
  1513.     subq.w    #1,d1
  1514.     beq    @f
  1515.     subq.w    #3,d1
  1516.     beq    Case2
  1517.     bra    no_switch
  1518. @@:
  1519.     bsr    int定数get
  1520.     move.l    d0,(a3)+    * case value
  1521.  
  1522.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1523.     move.l    a3,(a0)
  1524.     rts
  1525.  
  1526.  * 文字列用
  1527. Case2:
  1528.     moveq    #-1,d1
  1529.     cmpi.b    #'"',(a5)+
  1530.     bne    case_str_err
  1531.     move.l    a3,-(sp)
  1532.     addq.l    #2,a3
  1533. @@:
  1534.     move.b    (a5)+,d0
  1535.     cmpi.b    #'"',d0
  1536.     bhi    1f
  1537.     beq    2f
  1538.     cmpi.b    #$20,d0
  1539.     bcs    case_str_err
  1540. 1:
  1541.     move.b    d0,(a3)+
  1542.     addq.w    #1,d1
  1543.     bra    @b
  1544. 2:
  1545.     clr.b    (a3)+        * 文字列終
  1546.     clr.b    (a3)+
  1547.     move.l    a3,d0
  1548.     bclr    #0,d0
  1549.     move.l    (sp)+,a3
  1550.     move.w    d1,(a3)        * 文字列長さ - 1
  1551.  
  1552.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1553.     move.l    d0,(a0)
  1554.  
  1555.     rts
  1556.  
  1557.  
  1558.  
  1559.  
  1560. Default:
  1561.     movea.l    nest_work,a0
  1562.     move.l    (a0),d0
  1563.     beq    no_nest_structure
  1564.  *    $0001 = switch
  1565.  *    $0004 = switch(str)
  1566.     move.w    8(a0),d1
  1567.     subq.w    #1,d1
  1568.     beq    @f
  1569.     subq.w    #3,d1
  1570.     bne    no_switch
  1571. @@:
  1572.  
  1573.     movea.l    d0,a3
  1574.     move.l    a4,d0
  1575.     clr.l    (a3)+        * default
  1576.     move.l    d0,(a3)+    * default address
  1577.  
  1578.     move.l    a3,(a0)        * ネストバッファの終端を登録
  1579.  
  1580.     rts
  1581.  
  1582.  
  1583.  
  1584.  
  1585.     .xdef    Endswitch
  1586. Endswitch:
  1587.     moveq    #8*2,d2        * 'break'$$$
  1588.     bsr    Break
  1589.  
  1590.     movea.l    nest_work,a0
  1591.     move.l    (a0),d2            * last address
  1592.     beq    no_nest_structure
  1593.     addq.l    #8,a0
  1594.  
  1595.  *    $0001 = switch
  1596.  *    $0004 = switch(str)
  1597.     move.w    (a0)+,d5
  1598.     subq.w    #1,d5
  1599.     beq    @f
  1600.     cmpi.w    #3,d5
  1601.     bne    no_switch
  1602. @@:
  1603.  * d5 = 0    int
  1604.  * d5 = 3    str
  1605.  
  1606.     move.l    a4,d0
  1607.     move.l    (a0)+,a3    * switch から 'menu' に飛ぶアドレスを書く所
  1608.     bsr    address書き込みa3
  1609.  
  1610.  
  1611.     move.l    a4,a2        * case の個数置き用アドレス保存
  1612.     addq.l    #2,a4
  1613.     moveq    #0,d3        * case の個数カウンタ (最上位BIT = default の後 flag)
  1614.     clr.l    -(sp)        * break 用 '番人'
  1615. endsw_loop:
  1616.     cmpa.l    d2,a0
  1617.     bcc    endsw_loop_end
  1618.  
  1619.     move.l    (a0)+,d0    * address ( <0:cont. ,  =0:default )
  1620.     bmi    cont_in_switch    * continue : あるはずない(if 内から払い下げとか)
  1621.     beq    es_default
  1622.     bclr    #$1d,d0        * CASE :
  1623.     bne    es_case
  1624.  
  1625.  * break
  1626.     move.l    d0,-(sp)
  1627.     bra    endsw_loop
  1628.  
  1629.  
  1630. es_case:
  1631.     addq.l    #1,d3
  1632.     bmi    after_default
  1633. *    move.w    #$0001,(a4)+    * case
  1634.     tst.w    d5
  1635.     bne    es_case_str
  1636.     move.l    (a0)+,(a4)+    * case value
  1637.     bsr    address書き込み
  1638.     bra    endsw_loop
  1639.  
  1640. es_case_str:
  1641.     move.w    (a0)+,d1    * 文字列長さ - 1
  1642.     move.w    d1,(a4)+
  1643.     addq.w    #1,d1
  1644.     lsr.w    #1,d1
  1645. @@:
  1646.     move.w    (a0)+,(a4)+
  1647.     dbra    d1,@b
  1648.     bsr    address書き込み
  1649.     bra    endsw_loop
  1650.  
  1651.  
  1652. es_default:
  1653.     bset    #31,d3
  1654.     bne    after_default
  1655.     move.l    (a0)+,d0    * default address
  1656. *    move.w    #$ffff,(a4)+    * default
  1657.     bsr    address書き込み
  1658.     bra    endsw_loop
  1659.  
  1660.  
  1661. endsw_loop_end:
  1662. *    clr.w    (a4)+        * switch 終わりだ
  1663.     subq.w    #1,d3
  1664.     bcs    no_case
  1665.     move.w    d3,(a2)        * case の個数 - 1
  1666.     tst.l    d3
  1667.     bmi    @f
  1668.     moveq    #4,d0
  1669.     move.l    d0,(a4)+    * default 無かった時、飛び先をendswitch の後に
  1670. @@:
  1671.     move.l    (sp)+,d0    * break address
  1672.     beq    @f
  1673.     movea.l    d0,a3
  1674.     move.l    a4,d0
  1675.     bsr    address書き込みa3    * 各 case の後などにある break の飛び先を書く
  1676.     bra    @b
  1677.  
  1678. @@:
  1679.     bsr    nest削除
  1680.  
  1681.     rts
  1682.  
  1683.  
  1684.  
  1685. no_switch:
  1686.     ERROR    47
  1687. after_default:
  1688.     ERROR    61
  1689. case_str_err:
  1690.     ERROR    31    * 式の型が違う
  1691. no_case:
  1692.     ERROR    48
  1693.  
  1694.  
  1695.  
  1696.  
  1697.  
  1698. Break:
  1699.     move.w    d2,(a4)+    * 中間言語書き込み
  1700.  
  1701.     movea.l    nest_work,a0
  1702.     move.l    (a0),d0
  1703.     beq    no_nest_structure
  1704.     movea.l    d0,a3
  1705.     move.l    a4,(a3)+
  1706.     move.l    a3,(a0)
  1707.     addq.l    #4,a4
  1708.     rts
  1709.  
  1710.  
  1711. Continue:
  1712.     move.w    d2,(a4)+    * 中間言語書き込み
  1713.  
  1714.     movea.l    nest_work,a0
  1715.     move.l    (a0),d0
  1716.     beq    no_nest_structure
  1717.  
  1718.     move.w    8(a0),d1
  1719.     cmpi.w    #1,d1            * 種類(switch)
  1720.     beq    cont_in_switch
  1721.     cmpi.w    #$11,d1            * 種類(switch)
  1722.     beq    cont_in_switch
  1723.  
  1724.     movea.l    d0,a3
  1725.     move.l    a4,d0
  1726.     neg.l    d0
  1727.     move.l    d0,(a3)+
  1728.     move.l    a3,(a0)
  1729.     addq.l    #4,a4
  1730.     rts
  1731.  
  1732. cont_in_switch:
  1733.     ERROR    46
  1734. no_nest_structure:
  1735.     ERROR    28
  1736.  
  1737.  
  1738.  
  1739.     .xdef    If
  1740. If:
  1741.     move.w    d2,(a4)+    * 中間言語書き込み
  1742.  
  1743.     movea.l    a4,a3
  1744.     moveq    #0,d2
  1745.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  1746.  * int        d2.w    = 0000
  1747.     bsr    math解釈
  1748.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  1749.  
  1750.     tst.w    (a4)        * =0 ... int演算子
  1751.     bne    1f
  1752.     move.w    2(a4),d2
  1753.     subi.w    #9*2,d2        * 9-14 : 関係演算子
  1754.     bcs    1f
  1755.     cmpi.w    #6*2,d2
  1756.     bcc    1f
  1757.     tst.b    4+1(a4)        * int 型
  1758.     bne    1f
  1759.     addi.w    #42*2,d2
  1760.     move.w    d2,-2(a4)    * 中間言語書き込み $$$(42-47)
  1761.  
  1762.     lsr.w    #1,d0
  1763.     subq.w    #2+1,d0
  1764. @@:
  1765.     move.w    4(a4),(a4)+
  1766.     dbra    d0,@b
  1767.     bra    2f
  1768.  
  1769. 1:
  1770.     movea.l    a3,a4
  1771. 2:
  1772.     moveq    #3,d2
  1773.  * nest 登録
  1774.  * d2.w = 登録する種類
  1775.  *    $0003 = if
  1776.     bsr    nest登録
  1777.  *    a3 = 書き込みアドレス
  1778.  
  1779.     lea.l    _then(pc),a2
  1780.     bsr    one_check
  1781.     bmi    err_if
  1782.  
  1783.     bsr    first_check_a5_in_line
  1784.  
  1785.     moveq    #0,d0
  1786.     cmpi.b    #'{',(a5)
  1787.     bne    @f
  1788.     moveq    #1,d0        * then_block_flag on
  1789.     addq.l    #1,a5
  1790. @@:
  1791.     move.w    d0,(a3)+    * flag
  1792.     move.l    a4,(a3)+    * label 1 を書くアドレス
  1793.     addq.l    #4,a4
  1794.  
  1795.     movea.l    nest_work,a0    * ネストものの終わりの決まり文句
  1796.     move.l    a3,(a0)
  1797.  
  1798.     move.b    #':',-(a5)    ** 姑息! **
  1799.  
  1800.     rts
  1801.  
  1802.  
  1803. _then:
  1804.     .dc.b    'then',0,0
  1805.  
  1806.  
  1807.  
  1808. err_if:
  1809.     ERROR    30
  1810. Then:
  1811. Else0:
  1812.     ERROR    29    * not exist 'if'
  1813.  
  1814.  
  1815.  
  1816.     .xdef    Else
  1817. Else:
  1818. *    move.w    d2,(a4)+    * 中間言語書き込み
  1819.     move.w    #40*2,(a4)+    * 中間言語書き込み 'else'$$$
  1820.  
  1821.     movea.l    nest_work,a0
  1822.     move.l    (a0),d0
  1823.     beq    Else0        * ネストバッファ空っぽ (村重さん)
  1824.     addq.l    #8,a0
  1825.     cmpi.w    #3,(a0)+        * 種類
  1826.     bne    Else0
  1827.  
  1828.     tst.w    (a0)
  1829.     bne    Else0    * else 二重に使うなんて! or
  1830.             * '{' に対応する '}' がないよ  thanks for 村重さん (H8/2/1)
  1831.  
  1832.     bsr    first_check_a5_in_line
  1833.  * 数字なら            d0 = 0
  1834.  * 行の終わりなら        d0 = -1
  1835.  * その他なら            d0 = そのキャラクタ
  1836.     moveq    #2,d1        * else
  1837.     cmpi.b    #'{',d0
  1838.     bne    @f
  1839.     moveq    #3,d1        * else_block_flag on
  1840.     addq.l    #1,a5
  1841. @@:
  1842.     move.w    d1,(a0)+        * flag
  1843.  
  1844.     move.l    a4,d1        * label 2 を書くアドレス
  1845.     movea.l    (a0),a4        * label 1 を書くアドレス
  1846.     move.l    d1,d0
  1847.     addq.l    #4,d0        * label 1
  1848.     bsr    address書き込み
  1849.  
  1850.     movea.l    d1,a4
  1851.     addq.l    #4,a4        * label 1
  1852.     move.l    d1,(a0)        * label 2 を書くアドレス
  1853.  
  1854.  
  1855.     move.b    #':',-(a5)    ** 姑息! **
  1856.     rts
  1857.  
  1858.  
  1859.  
  1860.  
  1861.     .xdef    If_end
  1862. If_end:
  1863.     movea.l    nest_work,a0
  1864.     movea.l    a0,a3
  1865.  
  1866.     move.l    (a0)+,d2    * 次のブロックアドレス(このブロックの最終アドレス)
  1867.     move.l    (a0)+,-(sp)    * 前のブロックのアドレス
  1868.  
  1869.     cmpi.w    #3,(a0)+    * if
  1870.     bne    Else0
  1871.     addq.l    #2,a0
  1872.  
  1873.     move.l    a4,d1    * 保存
  1874.     move.l    a4,d0    * 飛び先
  1875.     movea.l    (a0)+,a4    * label ? を書くアドレス
  1876.     bsr    address書き込み
  1877.     movea.l    d1,a4    * 復活
  1878.  
  1879.     sub.l    a0,d2
  1880.     beq    If_end_end
  1881.  
  1882.     lsr.w    #2,d2
  1883.     subq.w    #1,d2
  1884. @@:
  1885.     move.l    (a0)+,(a3)+        * break,continue の上のネストへの引き継ぎ
  1886.     dbra    d2,@b
  1887.  
  1888. If_end_end:
  1889.     move.l    (sp)+,d0
  1890.     beq    @f
  1891.     move.l    d0,nest_work        * 前のブロックのアドレス
  1892.     movea.l    d0,a0    * ネストものの終わりの決まり文句
  1893.     move.l    a3,(a0)
  1894.     rts
  1895.  
  1896. @@:
  1897.     move.l    nest_work,a0
  1898.     clr.l    (a0)        * ネスト構造無し
  1899.     rts
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907.  
  1908.     .xdef    While
  1909. While:
  1910.     move.w    d2,(a4)+    * 中間言語書き込み
  1911.  
  1912.     moveq    #-1,d2
  1913.  * nest 登録
  1914.  * d2.w = 登録する種類
  1915.  *    $ffff = while
  1916.     bsr    nest登録
  1917.  *    a3 = 書き込みアドレス
  1918.  
  1919.  
  1920.     move.l    a3,-(sp)
  1921.     addq.l    #2,a3        * 長さ
  1922.  
  1923.  * 式 解釈
  1924.     moveq    #0,d2
  1925.  * int        d2.w    = 0000
  1926.     bsr    math解釈
  1927.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  1928.     move.l    (sp)+,a3
  1929.  
  1930.     lsr.w    #1,d0
  1931.     subq.w    #1,d0
  1932.     move.w    d0,(a3)+    * 長さ / 2 - 1
  1933. @@:
  1934.     move.w    (a3)+,(a4)+    * 式 コピー
  1935.     dbra    d0,@b
  1936.  
  1937.     addq.l    #4,a4
  1938.     move.l    a4,(a3)+    * label 2    ( loop address )
  1939.     lea.l    -4(a4),a0
  1940.     move.l    a0,(a3)+    * label 1 を書くアドレス    ( break address )
  1941.  
  1942.     movea.l    nest_work,a0
  1943.     move.l    a3,(a0)
  1944.  
  1945.     rts
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951. For:
  1952.     move.w    d2,(a4)+    * 中間言語書き込み
  1953.  
  1954.     moveq    #0,d2
  1955.  * nest 登録
  1956.  * d2.w = 登録する種類
  1957.  *    $0000 = for
  1958.  *    $ffff = while
  1959.  *    $0001 = switch
  1960.  *    $0002 = repeat
  1961.  *    $0003 = if
  1962.     bsr    nest登録
  1963.  *    a3 = 書き込みアドレス
  1964.  
  1965.     bsr    hash
  1966.  * a2.l = 元の対象の開始アドレス
  1967.  * d4.l = (hash.w)(文字数-1)
  1968.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  1969.     tst.w    d4
  1970.     bmi    err_for
  1971.  *         d4.l = * (hash.w)(文字数-1)
  1972.  *         a2.l = 元の対象の開始アドレス
  1973.     move.l    a3,-(sp)
  1974.      bsr    variable_check
  1975.  * 重なってない        d2.l    = -1
  1976.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  1977.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  1978.  * d0 =   0 : 普通の変数
  1979.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  1980.  *    $80 : auto 変数
  1981.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  1982.  *     -1 : 当たりなし
  1983.     bge    @f
  1984.     bsr    未宣言をint_sub
  1985.     bra    for_1
  1986.  
  1987. @@:
  1988.     tst.l    d2
  1989.     bmi    misengen_var        * システム変数も含む
  1990.  
  1991.     tst.w    d2        * $0000 = int
  1992.     bne    型違い
  1993.  
  1994.     tst.b    d0
  1995.     bge    for_1
  1996.     swap    d2
  1997.     not.w    d2        * AUTO 変数
  1998.     swap    d2
  1999. for_1:
  2000.     move.l    (sp)+,a3
  2001.  
  2002.     cmpi.b    #'=',(a5)+
  2003.     bne    err_for
  2004.  
  2005.  * 式1解釈
  2006.     move.l    a3,-(sp)
  2007.     movea.l    a4,a3
  2008.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2009.  * int        d2.w    = 0000
  2010.     bsr    math解釈
  2011.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2012.  
  2013.     movea.l    a3,a4
  2014.     move.l    (sp)+,a3
  2015.  
  2016.     swap    d6        * 変数番号
  2017.     move.w    d6,(a4)+        * 中間言語書き込み
  2018.  
  2019.  
  2020.     bsr    first_check_a5_in_line
  2021.  * 数字なら            d0 = 0
  2022.  * 行の終わりなら        d0 = -1
  2023.  * その他なら            d0 = そのキャラクタ
  2024.     tst.w    d0
  2025.     ble    err_for
  2026.     cmpi.b    #'t',(a5)+
  2027.     bne    err_for
  2028.     cmpi.b    #'o',(a5)+
  2029.     bne    err_for
  2030.  
  2031.  
  2032.  
  2033.     move.l    a3,-(sp)
  2034.     addq.l    #2,a3        * 長さ
  2035.     move.w    d6,(a3)+    * int 変数番号
  2036.  
  2037.     movea.l    a4,a3
  2038.  * 式2解釈
  2039.     moveq    #0,d2
  2040.  * int        d2.w    = 0000
  2041.     bsr    math解釈
  2042.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2043.     move.l    (sp)+,a3
  2044.  
  2045.     cmpi.w    #$8000,(a4)    * int 定数
  2046.     beq    next2
  2047.  
  2048.     lsr.w    #1,d0
  2049.     move.w    d0,(a3)        * 長さ / 2
  2050.     addq.l    #4,a3
  2051.     subq.w    #1,d0        * 長さ / 2 - 1
  2052. @@:
  2053.     move.w    (a4)+,(a3)+    * 式2コピー
  2054.     dbra    d0,@b
  2055.     bra    for_3
  2056.  
  2057. next2:            * 終値が定数の時は特別
  2058.     clr.w    (a3)        * 長さ = 0 が特別の印
  2059.     addq.l    #4,a3
  2060.     addq.l    #2,a4
  2061.     move.l    (a4)+,(a3)+    * 式2(ロングワード定数)コピー
  2062.  
  2063.  
  2064. for_3:
  2065.     movea.l    a4,a0
  2066.     addq.l    #4,a4
  2067.     move.l    a4,(a3)+    * label 2    ( loop address )
  2068.     move.l    a0,(a3)+    * label 1 を書くアドレス    ( break address )
  2069.  
  2070.  
  2071.     movea.l    nest_work,a0
  2072.     move.l    a3,(a0)
  2073.  
  2074.     rts
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081. misengen_var:
  2082.     ERRORS    7
  2083. 型違い:
  2084.     ERRORS    26
  2085. err_for:
  2086.     ERROR    25    * for
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092. Repeat:
  2093.     moveq    #2,d2
  2094.  * nest 登録
  2095.  * d2.w = 登録する種類
  2096.  *    $0002 = repeat
  2097.     bsr    nest登録
  2098.  *    a3 = 書き込みアドレス
  2099.  
  2100.     move.l    a4,(a3)+    * label 2    ( loop address )
  2101.  
  2102.     movea.l    nest_work,a0
  2103.     move.l    a3,(a0)
  2104.  
  2105.     rts
  2106.  
  2107.  
  2108.  
  2109.  
  2110. Until:
  2111.     move.l    a4,d3            * label 3 (continue address)
  2112.  
  2113.     move.w    d2,(a4)+    * 中間言語書き込み
  2114.     movea.l    nest_work,a3
  2115.     move.l    (a3),d2            * 末尾アドレス
  2116.     beq    repeatない        * H8/2/1 thanks for 村重さん
  2117.     addq.l    #8,a3
  2118.     cmpi.w    #2,(a3)+
  2119.     bne    repeatない
  2120.  
  2121.  * 式1解釈
  2122.  
  2123.     movem.l    d2/d3/a3,-(sp)
  2124.     movea.l    a4,a3
  2125.     moveq    #0,d2
  2126.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2127.  * int        d2.w    = 0000
  2128.     bsr    math解釈
  2129.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2130.  
  2131.     movea.l    a3,a4
  2132.     movem.l    (sp)+,d2/d3/a3
  2133.  
  2134.  
  2135.     bra    Next飛込2
  2136.  
  2137.  
  2138.  
  2139.  
  2140. repeatない:
  2141.     ERROR    33
  2142.  
  2143.  
  2144.  
  2145.  
  2146. Endwhile:
  2147.     move.l    a4,d3            * label 3 (continue address)
  2148.  
  2149.     move.w    d2,(a4)+    * 中間言語書き込み
  2150.     movea.l    nest_work,a3
  2151.     move.l    (a3),d2            * 末尾アドレス
  2152.     beq    whileない        * H8/2/1 thanks for 村重さん
  2153.     addq.l    #8,a3
  2154.     cmpi.w    #$ffff,(a3)+
  2155.     beq    Next飛込
  2156. whileない:
  2157.     ERROR    32
  2158.  
  2159.  
  2160.  
  2161. Next:
  2162.     move.l    a4,d3            * label 3 (continue address)
  2163.  
  2164.     move.w    d2,(a4)+    * 中間言語書き込み
  2165.     movea.l    nest_work,a3
  2166.     move.l    (a3),d2            * 末尾アドレス
  2167.     beq    forない            * H8/2/1 thanks for 村重さん
  2168.     addq.l    #8,a3
  2169.     tst.w    (a3)+
  2170.     bne    forない
  2171. Next飛込:        * Endwhile と(ほぼ)共通の処理
  2172.     move.w    (a3)+,d0    * 式の長さ
  2173.     beq    Next特別
  2174. @@:
  2175.     move.w    (a3)+,(a4)+    * (変数番号、)式 コピー
  2176.     dbra    d0,@b
  2177.     bra    Next飛込2
  2178. Next特別:
  2179.     addq.w    #1*2,-2(a4)    * statement #$$$ = 'Next2' 終値定数用
  2180.     move.w    (a3)+,(a4)+    * 変数番号
  2181.     move.l    (a3)+,(a4)+    * 式 コピー
  2182.  
  2183. Next飛込2:
  2184.     move.l    (a3)+,d0        * loop address
  2185.     bsr    address書き込み
  2186.     move.l    a4,d1            * label 1 (break address)
  2187.  
  2188.     sub.l    a3,d2
  2189.     lsr.w    #2,d2
  2190.     subq.w    #1,d2
  2191.     bcs    next_out
  2192. next_loop:
  2193.     move.l    (a3)+,d0
  2194.     bge    next_label1
  2195.  * label 3
  2196.     neg.l    d0
  2197.     movea.l    d0,a4
  2198.     move.l    d3,d0
  2199.     bra    @f
  2200. next_label1:
  2201.     movea.l    d0,a4
  2202.     move.l    d1,d0
  2203. @@:
  2204.     bsr    address書き込み
  2205.  
  2206.     dbra    d2,next_loop
  2207. next_out:
  2208.     bsr    nest削除
  2209.     movea.l    d1,a4
  2210.     rts
  2211.  
  2212.  
  2213.  
  2214.  
  2215. address書き込み:
  2216.     sub.l    a4,d0
  2217.     move.l    d0,(a4)+
  2218.     rts
  2219. address書き込みa3:
  2220.     sub.l    a3,d0
  2221.     move.l    d0,(a3)+
  2222.     rts
  2223.  
  2224. forない:
  2225.     ERROR    27
  2226.  
  2227.  
  2228.  
  2229.  
  2230. **    **    **
  2231.  
  2232. Error:
  2233.     move.w    d2,(a4)+    * 中間言語書き込み
  2234.     cmpi.b    #'o',(a5)+
  2235.     bne    bunpo_err    * 手抜き
  2236.     move.b    (a5)+,d0
  2237.     cmpi.b    #'n',d0
  2238.     beq    @f
  2239.     cmpi.b    #'f',d0
  2240.     bne    bunpo_err    * 手抜き
  2241.     cmpi.b    #'f',(a5)+
  2242.     bne    bunpo_err    * 手抜き
  2243.     clr.w    (a4)+
  2244.     rts
  2245. @@:
  2246.     move.w    #-1,(a4)+
  2247.     rts
  2248.  
  2249. bunpo_err:
  2250.     ERROR    4
  2251.  
  2252.  
  2253. Beep:
  2254. Cls:
  2255. End:
  2256. Stop:
  2257.     move.w    d2,(a4)+    * 中間言語書き込み
  2258.     rts
  2259.  
  2260.  
  2261. Exit:
  2262.     cmpi.b    #'(',(a5)+
  2263.     bne    exit_err
  2264.  
  2265.     bsr    first_check_a5_in_line
  2266.     cmpi.b    #')',d0
  2267.     beq    no_exitcode
  2268.  
  2269.     move.w    d2,(a4)+    * 中間言語書き込み
  2270.  
  2271.     moveq    #0,d2
  2272.     movea.l    a4,a3
  2273.  * int        d2.w    = 0000
  2274.     bsr    math解釈
  2275.     movea.l    a3,a4
  2276.  
  2277.     cmpi.b    #')',(a5)+
  2278.     bne    exit_err
  2279.     rts
  2280.  
  2281. no_exitcode:
  2282.     addq.l    #1,a5
  2283.     move.w    d2,(a4)+    * 中間言語書き込み (H8/9/1)
  2284.     move.w    #$8000,(a4)+    * 定数を示す
  2285.     clr.l    (a4)+        * int ( 0 )
  2286.     rts
  2287.  
  2288. exit_err:
  2289.     ERROR    62
  2290.  
  2291.  
  2292.  
  2293. **    **    **
  2294.  
  2295.  
  2296. Key:
  2297.     move.w    d2,(a4)+    * 中間言語書き込み
  2298.     movea.l    a4,a3
  2299.     moveq    #0,d2        * int
  2300.     bsr    math解釈
  2301.     cmpi.b    #',',(a5)+
  2302.     bne    key_err
  2303.     move.w    #$0100,d2    * str
  2304.     bsr    math解釈
  2305.     movea.l    a3,a4
  2306.     rts
  2307. key_err:
  2308.     ERROR    63
  2309.  
  2310.  
  2311. Color:
  2312.     bsr    first_check_a5_in_line
  2313.  * 数字なら            d0 = 0
  2314.  * 行の終わりなら        d0 = -1
  2315.  * その他なら            d0 = そのキャラクタ
  2316.     cmpi.b    #'[',d0
  2317.     beq    Color_Palet
  2318. Width:
  2319.     move.w    d2,(a4)+    * 中間言語書き込み
  2320.     moveq    #1-1,d2
  2321.     bsr    d2_int_para
  2322.     rts
  2323.  
  2324.  
  2325. Color_Palet:
  2326.     move.w    #35*2,(a4)+    * 中間言語書き込み 35= 'color[' $$$
  2327.     moveq    #4-1,d2
  2328.     addq.l    #1,a5
  2329.     bra    @f
  2330. Color_Palet_loop:
  2331.     bsr    first_check_a5_in_line
  2332.     cmpi.b    #',',d0
  2333.     bne    @f
  2334.     addq.l    #1,a5
  2335. @@:
  2336.     bsr    first_check_a5_in_line
  2337.     cmpi.b    #',',d0
  2338.     beq    CP値無し
  2339.     cmpi.b    #']',d0
  2340.     bne    @f
  2341. CP値無し:
  2342.     move.w    #-1,(a4)+
  2343.     bra    Color_Palet_cont
  2344. @@:
  2345.     clr.w    (a4)+        * 値あり
  2346.     move.w    d2,-(sp)
  2347.     moveq    #0,d2
  2348.     movea.l    a4,a3
  2349.     bsr    math解釈
  2350.     movea.l    a3,a4
  2351.     move.w    (sp)+,d2
  2352. Color_Palet_cont:
  2353.     dbra    d2,Color_Palet_loop
  2354.     cmpi.b    #']',(a5)+
  2355.     bne    cp_err
  2356.     rts
  2357. cp_err:
  2358.     ERROR    23
  2359.  
  2360.  
  2361. Console:
  2362.     cmpi.b    #',',(a5)
  2363.     beq    Console_para12_略
  2364.  
  2365.     lea.l    tmp,a3
  2366.     move.w    d2,(a3)+    * 中間言語書き込み
  2367.     moveq    #0,d2
  2368.     bsr    math解釈
  2369.  
  2370.     cmpi.b    #',',(a5)+
  2371.     bne    Console_para_err
  2372.     moveq    #0,d2
  2373.     bsr    math解釈
  2374.  
  2375.     move.l    a3,-(sp)
  2376.     bsr    Console_func
  2377.     move.l    (sp)+,d0
  2378.  
  2379.     lea.l    tmp,a0        * 第1・2パラメータを後から書き込む
  2380.     sub.l    a0,d0
  2381.     lsr.w    #1,d0
  2382.     subq.w    #1,d0
  2383. @@:
  2384.     move.w    (a0)+,(a4)+
  2385.     dbra    d0,@b
  2386.     rts
  2387.  
  2388.  
  2389. Console_para12_略:
  2390.     addq.l    #1,a5
  2391.     bsr    first_check_a5_in_line
  2392. Console_func:
  2393.     cmpi.b    #',',(a5)+
  2394.     bne    Console_para_err
  2395.  
  2396.     move.w    #36*2,(a4)+    * 中間言語書き込み 36= 'function on/off' $$$
  2397.     moveq    #1-1,d2
  2398.     bsr    d2_int_para
  2399.     rts
  2400.  
  2401. Console_para_err:
  2402.     ERROR    53
  2403.  
  2404.  
  2405. Screen:
  2406.     move.w    d2,(a4)+    * 中間言語書き込み
  2407.     moveq    #1-1,d2        * こB(H8/2/14)
  2408.     bsr    d2_int_para
  2409.     rts
  2410.  
  2411.  
  2412. Locate:
  2413.     cmpi.b    #',',(a5)
  2414.     beq    cursorSWのみ
  2415.  
  2416.     move.w    d2,(a4)+    * 中間言語書き込み
  2417.     moveq    #2-1,d2
  2418.     bsr    d2_int_para
  2419.     cmpi.b    #',',(a5)
  2420.     beq    cursorSW
  2421.     rts
  2422.  
  2423.  
  2424. cursorSWのみ:
  2425.     addq.l    #1,a5
  2426.     bsr    first_check_a5_in_line
  2427.     cmpi.b    #',',d0
  2428.     bne    para変
  2429. cursorSW:
  2430.     addq.l    #1,a5
  2431.     move.w    #37*2,(a4)+        * CursorSW $$$
  2432.  
  2433.     moveq    #0,d2
  2434.     movea.l    a4,a3
  2435.     bsr    math解釈
  2436.     movea.l    a3,a4
  2437.     rts
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443. dip_loop:
  2444.     cmpi.b    #',',(a5)+
  2445.     bne    para変
  2446.  
  2447. d2_int_para:
  2448.     move.w    d2,-(sp)
  2449.  
  2450.     moveq    #0,d2
  2451.     movea.l    a4,a3
  2452.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2453.  * int        d2.w    = 0000
  2454.     bsr    math解釈
  2455.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2456.  * int        d6.w    = 0000
  2457.     movea.l    a3,a4
  2458.  
  2459.     move.w    (sp)+,d2
  2460.     dbra    d2,dip_loop
  2461.     rts
  2462.  
  2463. para変:
  2464.     ERROR    22
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475. **    **    **
  2476.  
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482. CrLfEnd        equ    0
  2483. NoCrLfEnd    equ    2
  2484. TabJump        equ    4
  2485. UsingNum    equ    6
  2486. UsingStr    equ    8
  2487.  
  2488.     .xdef    Lprint
  2489. Lprint:
  2490. Print:
  2491.     move.w    d2,(a4)+    * 中間言語書き込み
  2492.  
  2493.     bsr    first_check_a5_in_line
  2494.     lea.l    _using(pc),a2
  2495.     bsr    one_check
  2496.     beq    PrintUsing
  2497.  
  2498. pr_loop:
  2499.     bsr    first_check_a5_in_line
  2500.  * 数字なら            d0 = 0
  2501.  * 行の終わりなら        d0 = -1
  2502.  * その他なら            d0 = そのキャラクタ
  2503.     tst.b    d0
  2504.     bmi    pr_crlf_end
  2505.     beq    pr_main
  2506.     cmpi.b    #'}',d0
  2507.     beq    pr_crlf_end
  2508.     cmpi.b    #':',d0
  2509.     bhi    pr_0
  2510.     beq    pr_crlf_end
  2511.     cmpi.b    #'/',d0
  2512.     bne    @f
  2513.     cmpi.b    #'*',1(a5)
  2514.     beq    pr_crlf_end
  2515. @@:
  2516.     cmpi.b    #',',d0
  2517.     beq    pr_1
  2518.     bra    pr_main
  2519.  
  2520. pr_0:
  2521.     cmpi.b    #';',d0
  2522.     beq    pr_2
  2523.  
  2524.  * else があるかどうかチェック
  2525.  * eq = ある , ne = ない
  2526.     bsr    else_check
  2527.     beq    pr_crlf_end
  2528.  
  2529.  
  2530. pr_main:
  2531.     moveq    #-1,d2
  2532.     lea.l    2(a4),a3
  2533.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2534.  * 型未判明    d2.w    = ffff
  2535.     bsr    math解釈
  2536.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  2537.  * int        d6.w    = 0000
  2538.  * str        d6.w    = 0100
  2539.  * char     d6.w    = 0200
  2540.  * float    d6.w    = 8000
  2541.  
  2542.     lsr.w    #8,d6
  2543.     bset    #15,d6        * 代入式の印、下位バイトは変数の型
  2544.     move.w    d6,(a4)+        * 中間言語書き込み
  2545.     add.l    d0,a4
  2546.  
  2547.     bra    pr_loop
  2548.  
  2549. pr_1:                * ','
  2550.     move.w    #TabJump,(a4)+
  2551.  
  2552. pr_2:                * ';'
  2553.     addq.l    #1,a5
  2554.     bsr    first_check_a5_in_line
  2555.  * 数字なら            d0 = 0
  2556.  * 行の終わりなら        d0 = -1
  2557.  * その他なら            d0 = そのキャラクタ
  2558.     tst.w    d0
  2559.     bmi    pr_not_crlf_end
  2560.     cmpi.b    #':',d0
  2561.     beq    pr_not_crlf_end
  2562.     cmpi.b    #'}',d0
  2563.     beq    pr_not_crlf_end
  2564.     cmpi.b    #'/',d0
  2565.     bne    @f
  2566.     cmpi.b    #'*',1(a5)
  2567.     beq    pr_not_crlf_end
  2568. @@:
  2569.  * else があるかどうかチェック
  2570.  * eq = ある , ne = ない
  2571.     bsr    else_check
  2572.     beq    pr_not_crlf_end
  2573.     bra    pr_loop
  2574.  
  2575. pr_not_crlf_end:
  2576.     move.w    #NoCrLfEnd,(a4)+
  2577.     rts
  2578. pr_crlf_end:
  2579. *    move.w    #CrLfEnd,(a4)+
  2580.     clr.w    (a4)+
  2581.     rts
  2582.  
  2583.  
  2584.  
  2585.  
  2586. PrintUsing:
  2587.     bsr    first_check_a5_in_line
  2588.     cmpi.b    #'"',(a5)+
  2589.     bne    using_format_err
  2590.     movea.l    a5,a2            * 引き数のフォーマット
  2591. @@:
  2592.     move.b    (a5)+,d0
  2593.     beq    using_format_err
  2594.     cmpi.b    #$a,d0
  2595.     beq    using_format_err
  2596.     cmpi.b    #'"',d0
  2597.     bne    @b
  2598.  
  2599.     moveq    #';',d2        * 最初の引き数の区切り記号
  2600.  
  2601.  
  2602. us_loop:
  2603.     bsr    us_sub
  2604.     move.w    _us(pc,d1.w),d1
  2605.     jmp    _us(pc,d1.w)
  2606. *    .dc.b    '_"#.+\*!&@',0
  2607. _us:
  2608.     .dc.w    us_mes-_us
  2609.     .dc.w    us_tosi-_us
  2610.     .dc.w    us_loop_end-_us
  2611.     .dc.w    us_num-_us
  2612.     .dc.w    us_period-_us
  2613.     .dc.w    us_plus-_us
  2614.     .dc.w    us_yen-_us
  2615.     .dc.w    us_ast-_us
  2616.     .dc.w    us_str1-_us
  2617.     .dc.w    us_str-_us
  2618.     .dc.w    us_str_all-_us
  2619.  
  2620. us_tosi:
  2621.     move.b    (a2)+,d0    * 素通し
  2622.     cmpi.b    #'"',d0
  2623.     beq    using_format_err
  2624.     cmpi.b    #$20,d0
  2625.     bcs    using_format_err
  2626.  
  2627.  
  2628.  * 普通の文字列の部分
  2629. us_mes:
  2630.     move.w    #$8001,(a4)+        * str 型
  2631.     move.w    #$8001,(a4)+        * 定数
  2632. us_mes_loop:
  2633.     move.b    d0,(a4)+
  2634.     bsr    us_sub
  2635.     subq.w    #2,d1
  2636.     bcs    us_mes_loop
  2637.     beq    us_素通し    * d1 = '_'
  2638.  * 何かのフォーマットがあっただ
  2639.     bsr    a4word境界        * 文字列の後始末
  2640.     subq.l    #1,a2
  2641.     bra    us_loop
  2642. us_素通し:
  2643.     move.b    (a2)+,d0
  2644.     cmpi.b    #'"',d0
  2645.     beq    using_format_err
  2646.     cmpi.b    #$20,d0
  2647.     bcc    us_mes_loop
  2648.     bra    using_format_err
  2649.  
  2650.  
  2651. us_str1:
  2652.     moveq    #1-1,d0
  2653.     bra    us_str0
  2654.  
  2655. us_str:
  2656.     moveq    #1-1,d0
  2657. @@:
  2658.     addq.w    #1,d0
  2659.     cmpi.b    #$20,(a2)+
  2660.     beq    @b
  2661.     cmpi.b    #'&',-1(a2)
  2662.     bne    using_format_err
  2663. us_str0:
  2664.     cmp.b    (a5)+,d2
  2665.     bne    using_format_err0
  2666.     move.w    #UsingStr,(a4)+        * 中間言語書き込み = 8
  2667.     move.w    d0,-(sp)
  2668.     bsr    us_str_sub
  2669.     move.w    (sp)+,(a4)+        * 長さ
  2670.     bra    us_loop
  2671.  
  2672. us_str_all:
  2673.     cmp.b    (a5)+,d2
  2674.     bne    using_format_err0
  2675.     move.w    #$8001,(a4)+        * str型の意
  2676.     bsr    us_str_sub
  2677.     bra    us_loop
  2678.  
  2679. us_str_sub:
  2680.     movea.l    a4,a3
  2681.     move.w    #$0100,d2
  2682.     move.l    a2,-(sp)
  2683.     bsr    math解釈
  2684.     move.l    (sp)+,a2
  2685.     moveq    #',',d2        * 次の引き数の区切り記号
  2686.     movea.l    a3,a4
  2687.     rts
  2688.  
  2689.  
  2690. us_ast:
  2691.     cmpi.b    #'*',(a2)+
  2692.     bne    using_format_err
  2693.     moveq    #$1,d4        * 前に*
  2694.     moveq    #2-1,d0
  2695.     cmpi.b    #'\',(a2)+
  2696.     bne    us_num1
  2697.     moveq    #$1+2,d4    * 前に¥*
  2698.     moveq    #3-1,d0
  2699.     bra    us_num0
  2700. us_yen:
  2701.     cmpi.b    #'\',(a2)+
  2702.     bne    using_format_err
  2703.     moveq    #$2,d4        * 前に¥
  2704.     moveq    #2-1,d0
  2705.     bra    us_num0
  2706. us_plus:
  2707.     moveq    #$10,d4        * 前にプラス
  2708.     moveq    #1-1,d0
  2709.     bra    us_num0
  2710.  * 数値のフォーマット '##.#'
  2711. us_period:
  2712.     cmpi.b    #'#',(a2)
  2713.     bne    us_mes        * .... とペリオドが並ぶとえげつないことに
  2714. us_num:
  2715.     moveq    #0,d4        * 数値のフォーマット指定用
  2716.     moveq    #-1,d0        * 前の桁の長さ用
  2717. us_num1:
  2718.     subq.l    #1,a2
  2719. us_num0:
  2720.     move.w    #UsingNum,(a4)+        * 中間言語書き込み = 6
  2721.  
  2722.     cmp.b    (a5)+,d2
  2723.     bne    using_format_err0
  2724.  
  2725.     move.l    a2,-(sp)
  2726.     movea.l    a4,a3
  2727.     move.w    #$8000,d2
  2728.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2729.  * float    d2.w    = 8000
  2730.     movem.w    d0/d4,-(sp)
  2731.     bsr    math解釈
  2732.     movem.w    (sp)+,d0/d4
  2733.  
  2734.     movea.l    a3,a4
  2735.     movea.l    (sp)+,a2
  2736.     moveq    #',',d2        * 次の引き数の区切り記号
  2737.  
  2738.     bsr    sharp_count
  2739.     move.w    d0,(a4)+    * 前の桁数
  2740.     cmpi.b    #',',(a2)
  2741.     bne    @f
  2742.     addq.l    #1,a2
  2743.     bset    #2,d4        * コンマ
  2744. @@:
  2745.     cmpi.b    #'.',(a2)
  2746.     bne    後ろの桁なし
  2747.     addq.l    #1,a2
  2748.     moveq    #-1,d0
  2749.     bsr    sharp_count
  2750.     move.w    d0,(a4)+    * 後ろの桁数
  2751.     bra    @f
  2752. 後ろの桁なし:
  2753.     move.w    #-1,(a4)+
  2754. @@:
  2755.     move.b    (a2),d0
  2756.     cmpi.b    #'+',d0
  2757.     beq    us_plus2
  2758.     cmpi.b    #'-',d0
  2759.     beq    us_minus
  2760.     cmpi.b    #'^',d0
  2761.     bne    us_format0
  2762.  
  2763. us_exp:
  2764.     moveq    #5-1,d1
  2765.     movea.l    a2,a0
  2766. @@:
  2767.     cmpi.b    #'^',(a0)+
  2768.     dbne    d1,@b
  2769.     bne    us_format0
  2770.     movea.l    a0,a2
  2771.     bset    #3,d4        * 指数表現
  2772.     bra    us_format0
  2773. us_plus2:
  2774.     bset    #5,d4        * 後ろ+
  2775.     bra    us_format
  2776. us_minus:
  2777.     bset    #6,d4        * 後ろ-
  2778. *    bra    us_format
  2779.  
  2780. us_format:
  2781.     addq.l    #1,a2
  2782. us_format0:
  2783.     move.w    d4,(a4)+
  2784.     bra    us_loop
  2785.  
  2786.  
  2787.  
  2788. us_loop_end:
  2789.     cmpi.b    #';',(a5)
  2790.     bne    pr_crlf_end
  2791.     addq.l    #1,a5
  2792.     bra    pr_not_crlf_end
  2793.  
  2794.  
  2795.  
  2796.  
  2797.  
  2798.  
  2799. sharp_count:
  2800.     addq.w    #1,d0
  2801.     cmpi.b    #'#',(a2)+
  2802.     beq    sharp_count
  2803.     subq.l    #1,a2
  2804.     rts
  2805.  
  2806.  
  2807. us_sub:
  2808.     move.b    (a2)+,d0
  2809.     beq    using_format_err
  2810.     lea.l    _us_check(pc),a0
  2811.     moveq    #0,d1
  2812. @@:
  2813.     addq.w    #2,d1
  2814.     move.b    (a0)+,d4
  2815.     beq    no_hit
  2816.     cmp.b    d4,d0
  2817.     bne    @b
  2818.     rts
  2819. no_hit:
  2820.     moveq    #0,d1
  2821.     rts
  2822.  
  2823.  
  2824. _us_check:
  2825.     .dc.b    '_"#.+\*!&@',0
  2826. _using:
  2827.     .dc.b    'using',0
  2828.     .even
  2829.  
  2830.  
  2831.  
  2832.  
  2833. using_format_err0:
  2834.     cmpi.b    #';',d2
  2835.     beq    using_no_semicolon
  2836. using_format_err:
  2837.     ERROR    51
  2838. using_no_semicolon:
  2839.     ERROR    52
  2840.  
  2841.  
  2842.  
  2843.  
  2844.  
  2845.  
  2846.  
  2847.  
  2848. a4word境界:
  2849.     clr.b    (a4)+
  2850.     clr.b    (a4)+
  2851.     move.l    a4,d0
  2852.     bclr    #0,d0
  2853.     movea.l    d0,a4
  2854.     rts
  2855.  
  2856.  
  2857.  
  2858.  
  2859. input_sub:
  2860.     addq.l    #1,a5
  2861. @@:
  2862.     move.b    (a5)+,d0
  2863.     beq    linput_err
  2864.     cmpi.b    #'"',d0
  2865.     beq    @f
  2866.     cmpi.b    #$d,d0
  2867.     beq    linput_err
  2868.     cmpi.b    #$a,d0
  2869.     beq    linput_err
  2870.     move.b    d0,(a4)+
  2871.     bra    @b
  2872. @@:
  2873.     bsr    first_check_a5_in_line
  2874.     rts
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880.  
  2881. Input:
  2882.     move.w    d2,(a4)+    * 中間言語書き込み
  2883.  
  2884.     cmpi.b    #'"',(a5)
  2885.     bne    @f
  2886.     bsr    input_sub
  2887.  
  2888.     cmpi.b    #",",d0
  2889.     beq    inp111
  2890.     cmpi.b    #";",d0
  2891.     beq    inp111
  2892.     bra    input_err
  2893. @@:
  2894.     subq.l    #1,a5
  2895. inp111:
  2896.     bsr    a4word境界
  2897.  
  2898.  * 変数名ゲット
  2899. input_loop:
  2900.     addq.l    #1,a5
  2901.  
  2902.     bsr    first_check_a5_in_line        * 7/11/8 (thanks for 金子さん)
  2903.     bsr    hash
  2904.     tst.w    d4
  2905.     bmi    input_err
  2906.      bsr    variable_check
  2907.  * 重なってない        d2.l    = -1
  2908.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2909.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2910.  * d0 =   0 : 普通の変数
  2911.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2912.  *    $80 : auto 変数
  2913.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2914.  *     -1 : 当たりなし
  2915.     tst.l    d2
  2916.     bmi    misengen_var        * システム変数も含む
  2917.  
  2918.     btst    #0,d0
  2919.     bne    型違い
  2920.  
  2921.     swap    d2        * 変数番号
  2922.     tst.b    d0
  2923.     bge    @f
  2924.     not.w    d2        * AUTO 変数
  2925. @@:
  2926.  
  2927.     move.l    d2,(a4)+
  2928.  
  2929.     cmpi.b    #',',(a5)
  2930.     beq    input_loop
  2931.  
  2932.     move.w    #$00ff,(a4)+    * 終わりの印
  2933.  
  2934.     rts
  2935.  
  2936.  
  2937.  
  2938.  
  2939.  
  2940. Linput:
  2941.     move.w    d2,(a4)+    * 中間言語書き込み
  2942.  
  2943.     cmpi.b    #'"',(a5)
  2944.     bne    @f
  2945.     bsr    input_sub
  2946.  
  2947.     cmpi.b    #";",(a5)+
  2948.     bne    linput_err
  2949. @@:
  2950.     bsr    a4word境界
  2951.  
  2952.  
  2953.  * 文字列変数名ゲット
  2954.     bsr    first_check_a5_in_line        * 7/11/8 (thanks for 金子さん)
  2955.     bsr    hash
  2956.     tst.w    d4
  2957.     bmi    linput_err
  2958.      bsr    variable_check
  2959.  * 重なってない        d2.l    = -1
  2960.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2961.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2962.  * d0 =   0 : 普通の変数
  2963.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2964.  *    $80 : auto 変数
  2965.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2966.  *     -1 : 当たりなし
  2967.     tst.l    d2
  2968.     bmi    misengen_var        * システム変数も含む
  2969.  
  2970.     cmpi.w    #$0100,d2        * $0100 = str
  2971.     bne    型違い
  2972.     btst    #0,d0
  2973.     bne    型違い
  2974.  
  2975.     swap    d2        * 変数番号
  2976.     tst.b    d0
  2977.     bge    @f
  2978.     not.w    d2        * AUTO 変数
  2979. @@:
  2980.  
  2981.     move.w    d2,(a4)+
  2982.     rts
  2983.  
  2984.  
  2985.  
  2986.  
  2987. linput_err:
  2988. input_err:
  2989.     ERROR    55
  2990.  
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999.  
  3000.  
  3001.  
  3002.  
  3003. **    **    **
  3004.  
  3005.  
  3006.  
  3007.  
  3008. _INT    equ    $00
  3009. _STR    equ    $01
  3010. _CHAR    equ    $02
  3011. _FLOAT    equ    $80
  3012.  
  3013.  
  3014.  * 型を得る(省略なら int )
  3015.     .xdef    型getS
  3016. 型getS:
  3017.  *         (INT,STR,CHAR,FLOAT)
  3018.  * d1.w  型を返す(  0,  2,   4,    6)
  3019.  * d0    = 0 省略せず
  3020.  *    = 1 省略
  3021.     bsr    first_check_a5_in_line
  3022.     tst.w    d0
  3023.     ble    dim_mis
  3024.  
  3025.     lea.l    _kata1(pc),a2
  3026.     moveq    #4-1,d1
  3027. @@:
  3028.  * (a2) と a5 からの文字列を見比べる。
  3029.  * 一致してかつ、後ろが英数字以外    zero
  3030.  * 不一致                non zero
  3031.  * a0,d0 : 破壊
  3032.  * a2    : $00 の後ろ(次の文字列)
  3033.     bsr    one_check
  3034.     dbeq    d1,@b
  3035.     beq    @f
  3036.     moveq    #0,d1
  3037.     moveq    #1,d0
  3038.     rts
  3039. @@:
  3040.     add.w    d1,d1
  3041.     eori.w    #6,d1
  3042.     moveq    #0,d0
  3043.     rts
  3044.  
  3045.  
  3046.  * 型を得る(省略なら int )
  3047.     .xdef    型get
  3048. 型get:
  3049.  * d0.w  型を返す(INT,STR,CHAR,FLOAT)
  3050.     bsr    first_check_a5_in_line
  3051.     tst.w    d0
  3052.     ble    dim_mis
  3053.  
  3054.     lea.l    _kata1(pc),a2
  3055.     lea.l    -2+_kata3(pc),a1
  3056.     moveq    #4-1,d1
  3057. @@:
  3058.  * (a2) と a5 からの文字列を見比べる。
  3059.  * 一致してかつ、後ろが英数字以外    zero
  3060.  * 不一致                non zero
  3061.  * a0,d0 : 破壊
  3062.  * a2    : $00 の後ろ(次の文字列)
  3063.     bsr    one_check
  3064.     addq.l    #2,a1
  3065.     dbeq    d1,@b
  3066.     bne    @f
  3067.     move.w    (a1),d0
  3068.     rts
  3069. @@:
  3070.     moveq    #0,d0
  3071.     rts
  3072. _kata1:
  3073.     .dc.b    'int',0
  3074.     .dc.b    'str',0
  3075.     .dc.b    'char',0
  3076.     .dc.b    'float',0
  3077.     .even
  3078. _kata3:
  3079.     .dc.w    _INT,_STR,_CHAR,_FLOAT
  3080. **    .dc.w    $0000,$0100,$0200,$8000
  3081.  
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089.  
  3090.  
  3091.  
  3092.  
  3093.  
  3094. 普通変数登録:
  3095.     moveq    #3,d1        * 一項辺りのデータサイズ ( = 2^3 = 8 )
  3096. *    bsr    変数登録sub
  3097. *    rts
  3098.  
  3099. 変数登録sub:
  3100.     moveq    #変数個数,d3
  3101.     lsl.w    d1,d3        * 一つの鎖のサイズ(バイト)
  3102.  
  3103.     movea.l    (a0)+,a3
  3104.     addq.w    #1,(a0)            * 登録数を一つ増やす
  3105.     move.w    (a0),d2            * 変数番号
  3106.     beq    新たな鎖
  3107.  
  3108.     move.w    d2,d0
  3109. @@:
  3110.     sub.w    #変数個数,d0
  3111.     bls    @f
  3112.     adda.w    d3,a3
  3113.     movea.l    (a3),a3        * 次の鎖
  3114.     bra    @b
  3115.  
  3116. @@:
  3117.     moveq    #変数個数-1,d0
  3118.     and.w    d2,d0
  3119.     bne    2f
  3120.  
  3121.  
  3122. 新たな鎖:
  3123.     movea.l    a0,a1
  3124.     move.w    d3,d0
  3125.     addq.w    #4,d0        * 次の鎖へのポインタ用
  3126.     bsr    malloc
  3127.     exg    a0,a1
  3128.  
  3129.     tst.w    d2
  3130.     bne    1f
  3131.  
  3132.     movea.l    a1,a3        * 最初の鎖
  3133.     move.l    a3,-4(a0)
  3134.     bra    3f
  3135.  
  3136. 1:
  3137.     move.l    a1,(a3,d3.w)     * 次の鎖へのつなぎ
  3138.     movea.l    a1,a3        * 新たな登録アドレス
  3139.     moveq    #変数個数-1,d0
  3140.     and.w    d2,d0
  3141.  
  3142. 2:
  3143.     lsl.w    d1,d0
  3144.     adda.w    d0,a3        * 登録アドレス
  3145.  
  3146.  
  3147. 3:
  3148.     move.l    d4,(a3)+    * (hash.w)(文字数 - 1)
  3149. *    move.w    d4,-(sp)
  3150.     bsr    名前登録    * a2,d4 破壊
  3151.     move.l    a0,(a3)+    * 名前アドレス
  3152. *    move.w    (sp)+,d4
  3153.     move.w    -4-2(a3),d4    * 4クロック得
  3154.  
  3155.     tst.b    d7
  3156.     bge    @f
  3157.     not.w    d2        * AUTO
  3158. @@:
  3159.     rts
  3160.  
  3161.  
  3162.  
  3163.  
  3164.  
  3165.  
  3166.  * 文字列の大きさの部分を飛ばす
  3167. str_size:
  3168.     subq.w    #_STR,d2    * str 型にサイズの指定ある?
  3169.     bne    @f
  3170.     cmpi.b    #'[',(a5)
  3171.     bne    @f
  3172.     addq.l    #1,a5
  3173.     bsr    int定数get
  3174.     bsr    first_check_a5_in_line
  3175.     cmpi.b    #']',(a5)+
  3176.     bne    var_def_err0
  3177. @@:
  3178.     rts
  3179.  
  3180.  
  3181.  
  3182.  
  3183.  
  3184.     .xdef    b_argc_def
  3185. b_argc_def:
  3186.     movem.l    d0-d7/a0-a5,-(sp)
  3187.  
  3188.     lea.l    _B_ARGC(pc),a5
  3189.     bsr    hash
  3190.     lea.l    変数int,a0
  3191.     bsr    普通変数登録    * 変数番号 0
  3192.  
  3193.     lea.l    _B_ARGV(pc),a5
  3194.     bsr    hash
  3195.     lea.l    配列,a0        * global
  3196.     moveq    #5,d1        * 一項辺りのデータサイズ ( = 2^5 = 32 )
  3197.     bsr    変数登録sub    * 配列番号 0
  3198.     move.w    #_STR*$100,(a3)+    * 型
  3199.     clr.l    (a3)        * '1 次元 - 1' + '添え字 0(変数領域大きさ計算用)'
  3200.  
  3201.  
  3202.     movem.l    (sp)+,d0-d7/a0-a5
  3203.     rts
  3204. _B_ARGC:
  3205.     .dc.b    'b_argc',0
  3206. _B_ARGV:
  3207.     .dc.b    'b_argv',0
  3208.     .even
  3209.  
  3210.  
  3211.     .xdef    未宣言をint_sub
  3212. 未宣言をint_sub:
  3213.     WARNS    59
  3214.  
  3215.     lea.l    変数int,a0
  3216.     tst.b    d7
  3217.     bge    @f
  3218.     lea.l    AUTOint,a0
  3219. @@:
  3220.     bsr    普通変数登録
  3221.     swap    d2
  3222.     clr.w    d2        * int
  3223.     rts
  3224.  
  3225.  
  3226.  
  3227. Int:
  3228.     move.w    #_INT,-(sp)
  3229.     lea.l    変数int,a0
  3230.     tst.b    d7
  3231.     bge    @f
  3232.     lea.l    AUTOint,a0
  3233. @@:    move.l    a0,-(sp)
  3234.     bsr    変数登録
  3235.     addq.l    #6,sp
  3236.     rts
  3237.  
  3238. Str:
  3239.     move.w    #_STR,-(sp)
  3240.     lea.l    変数str,a0
  3241.     tst.b    d7
  3242.     bge    @f
  3243.     lea.l    AUTOstr,a0
  3244. @@:    move.l    a0,-(sp)
  3245.     bsr    変数登録
  3246.     addq.l    #6,sp
  3247.     rts
  3248.  
  3249. Float:
  3250.     move.w    #_FLOAT,-(sp)
  3251.     lea.l    変数float,a0
  3252.     tst.b    d7
  3253.     bge    @f
  3254.     lea.l    AUTOfloat,a0
  3255. @@:    move.l    a0,-(sp)
  3256.     bsr    変数登録
  3257.     addq.l    #6,sp
  3258.     rts
  3259.  
  3260. Char:
  3261.     move.w    #_CHAR,-(sp)
  3262.     lea.l    変数char,a0
  3263.     tst.b    d7
  3264.     bge    @f
  3265.     lea.l    AUTOchar,a0
  3266. @@:    move.l    a0,-(sp)
  3267.     bsr    変数登録
  3268.     addq.l    #6,sp
  3269.     rts
  3270.  
  3271.  
  3272.     .xdef    Dim
  3273. Dim:
  3274.  * 型を得る(省略なら int )
  3275.     bsr    型get
  3276.  * d0.w  型を返す
  3277.     move.w    d0,-(sp)
  3278.     clr.l    -(sp)
  3279.     bsr    変数登録
  3280.     addq.l    #6,sp
  3281.     rts
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290.  
  3291.  
  3292.  
  3293.  
  3294. 変数登録loop:
  3295.     addq.l    #1,a5
  3296.  
  3297. 変数登録:
  3298.     bsr    first_check_a5_in_line
  3299.  * 数字なら            d0 = 0
  3300.  * 行の終わりなら        d0 = -1
  3301.  * その他なら            d0 = そのキャラクタ
  3302.     tst.w    d0
  3303.     ble    var_def_err0    * 数字や行末なら当然駄目だ (hash計算前 H8/2/1)
  3304.  
  3305.  
  3306.  * ハッシュ値を計算しながら、文字数を数える
  3307.     bsr    hash
  3308.  * a2.l = 元の対象の開始アドレス
  3309.  * d4.l = (hash.w)(文字数-1)
  3310.  * d1.b = お次の文字 ( ,: )
  3311.     tst.w    d4
  3312.     bmi    var_def_err
  3313.  
  3314.  * 対象がステートメント、関数と一致しないかどうか
  3315.     bsr    statement_check
  3316.  * 一致すれば        d0 = そのステートメント番号
  3317.  * 一致しなければ    d0 = 0
  3318.     tst.w    d0
  3319.     bne    var_def_err
  3320.  
  3321.  *        d4.l = * (hash.w)(文字数-1)
  3322.  *        a2.l = 元の対象の開始アドレス
  3323.     bsr    function_check
  3324.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  3325.     tst.w    d0
  3326.     bne    var_double_def_err    * 関数と同じ名前
  3327.  
  3328.  
  3329.  * 他の変数名と重なってないかどうか
  3330.  *         d4.l = * (hash.w)(文字数-1)
  3331.  *         a2.l = 元の対象の開始アドレス
  3332.      bsr    variable_check
  3333.     bmi    @f
  3334.     tst.b    d7
  3335.     bpl    var_double_def_err
  3336.     tst.b    d0
  3337.     bmi    var_double_def_err
  3338. @@:
  3339.  
  3340.  
  3341.     cmpi.b    #'(',(a5)    * 配列 ?
  3342.     bne    normal_var_def
  3343.  
  3344.  
  3345.  * 配列の登録だ
  3346.     tst.l    4(sp)        * 登録ハンドル
  3347.     beq    @f
  3348.     WARNS    11
  3349. @@:
  3350.  
  3351.     lea.l    配列,a0
  3352.     tst.b    d7
  3353.     bpl    @f
  3354.     lea.l    AUTO配列,a0
  3355. @@:
  3356.     moveq    #5,d1        * 一項辺りのデータサイズ ( = 2^5 = 32 )
  3357.     bsr    変数登録sub
  3358.  
  3359.     move.w    8(sp),d0
  3360.     lsl.w    #8,d0
  3361.     move.w    d0,(a3)+        * 型
  3362.  
  3363.     move.w    d2,-(sp)        * 配列番号保存
  3364.     move.l    a3,-(sp)        * 配列情報リストのポインタ保存
  3365.  
  3366.     lea.l    2(a3),a2        * 次元用に空けておく 配列情報ポインタ>>a2
  3367.                     * a3 は 'math解釈' で使うので
  3368.     moveq    #1,d1
  3369.     moveq    #-1,d2
  3370.  
  3371.     bclr    #localF,d7    * 添字の大きさに非定数があったかいな
  3372. soeji_loop:
  3373.     addq.l    #1,a5
  3374.  
  3375.     movem.l    d1-d6/a1-a2,-(sp)
  3376.     lea.l    tmp,a3        * H8/12/10
  3377.     moveq    #0,d2        * int型
  3378.     bsr    math解釈    * math解釈の最適化を利用
  3379.                 * 'math解釈' の内部では tmp は使わない H8/12/10
  3380.     movem.l    (sp)+,d1-d6/a1-a2
  3381.  
  3382.     lea.l    tmp,a1        * H8/12/10
  3383.     cmpi.w    #$80_00,(a1)+
  3384.     beq    添字の大きさは定数だ
  3385.         bset    #localF,d7    * 添字の大きさに非定数があったんや
  3386.         moveq    #0,d0        * << いらないけど一応
  3387.         bra    @f        * この処理があるから sub'int定数get' が使えないんよ
  3388. 添字の大きさは定数だ:
  3389.     move.l    (a1),d0
  3390. @@:
  3391.  
  3392.     cmpi.l    #$10000,d0
  3393.     bcc    dim_mis
  3394.     addq.w    #1,d2        * 次元勘定
  3395.     cmpi.w    #10,d2
  3396.     bcc    dim_ten_err    * 10次元まで
  3397.     move.w    d0,(a2)+    * 添え字
  3398.  
  3399.     addq.l    #1,d0
  3400.     FPACK    __LMUL
  3401.     move.l    d0,d1        * 配列データ部のサイズ(要素の個数全体)の計算
  3402.  
  3403.     bsr    first_check_a5_in_line
  3404.     cmpi.b    #',',d0
  3405.     beq    soeji_loop
  3406.  * 添字の大きさの解釈終わり
  3407.  
  3408.  * d1 = 配列データ部のサイズ(要素の個数全体)
  3409.     exg.l    a2,a3        * 役割また交代
  3410.     movea.l    (sp)+,a0    * 配列リストの '次元-1' を差すポインタ
  3411.     move.w    d2,(a0)+    * 次元 - 1
  3412.  
  3413.     btst    #localF,d7
  3414.     beq    添字の大きさは定数ばかりだった
  3415.         btst    #len_dimF,d7
  3416.         beq    可変長配列は使えへん
  3417.         move.w    #34*2,(a4)+        * 配列初期化 statement $$$
  3418.         move.b    #$ff,(a4)+    * 中間言語書き込み : 可変長配列の定義
  3419.         move.w    2+8(sp),d0    * 型
  3420.         move.b    d0,(a4)+    * 中間言語書き込み : 型
  3421.         move.w    (sp),(a4)+    * 中間言語書き込み : 配列番号
  3422.         bge    global可変長配列は使えへんねん
  3423.         move.w    d2,(a4)+    * 中間言語書き込み : 次元-1
  3424.     @@:
  3425.         clr.w    (a0)+        * 変数領域大きさ計算用に添字大きさクリア
  3426.         dbra    d2,@b
  3427.         lea.l    tmp,a0
  3428.         suba.l    a0,a2
  3429.         move.l    a2,d0
  3430.         lsr.w    #1,d0
  3431.         subq.w    #1,d0
  3432.     @@:
  3433.         move.w    (a0)+,(a4)+    * tmp に入れといた添字大きさ情報
  3434.         dbra    d0,@b
  3435.  
  3436. 添字の大きさは定数ばかりだった:
  3437.     bsr    first_check_a5_in_line
  3438.     cmpi.b    #')',(a5)+    * 配列の添え字
  3439.     bne    dim_mis
  3440.  
  3441.  
  3442.     move.w    2+8(sp),d2    * 型
  3443.     move.l    d1,-(sp)
  3444.     bsr    str_size
  3445.     move.l    (sp)+,d1
  3446.     move.w    (sp)+,d2    * 配列番号復帰
  3447.  
  3448.     bsr    first_check_a5_in_line
  3449.     cmpi.b    #'=',d0            * 初期値データある?
  3450.     bne    変数登録cont
  3451.  
  3452.     move.w    8(sp),d3    * 型
  3453. *    lsl.w    #8,d3
  3454.     bsr    dim_init_data
  3455.     bra    変数登録cont
  3456.  
  3457.  
  3458.  
  3459.  
  3460.  * 普通変数の登録だ
  3461. normal_var_def:
  3462.     movea.l    4(sp),a0        * 登録ハンドル
  3463.     move.l    a0,d2
  3464.     beq    dim_mis
  3465.     bsr    普通変数登録
  3466.  
  3467.     move.w    d2,-(sp)    * 変数番号
  3468.     move.w    2+8(sp),d2    * 型
  3469.     bsr    str_size
  3470.     move.w    (sp)+,d2    * 変数番号
  3471.  
  3472.     bsr    first_check_a5_in_line
  3473.     cmpi.b    #'=',(a5)    * 初期値がある?
  3474.     bne    変数登録cont
  3475.     addq.l    #1,a5
  3476.  
  3477.     move.w    d2,-(sp)    * 変数番号
  3478.     move.w    2+8(sp),d2    * 型
  3479.     bset    #15,d2        * 普通の代入
  3480.     move.w    d2,(a4)+    * 中間言語書き込み
  3481.  
  3482.     lsl.w    #8,d2
  3483.     movea.l    a4,a3
  3484.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  3485.  * 型未判明    d2.w    = ffff
  3486.     bsr    math解釈
  3487.     movea.l    a3,a4
  3488.  
  3489.     move.w    (sp)+,(a4)+    * 中間言語書き込み。変数番号。
  3490.  
  3491. 変数登録cont:
  3492.     cmpi.b    #',',(a5)    * 続きがある?
  3493.     beq    変数登録loop
  3494.     rts
  3495.  
  3496.  
  3497.  
  3498.  
  3499.  
  3500.  
  3501.  
  3502.  * 初期化データ
  3503.  *    d3 = 型
  3504.  *    d2 = 配列番号
  3505.  *    d1 = 添え字大きさ
  3506.     .xdef    dim_init_data
  3507. dim_init_data:
  3508.     addq.l    #1,a5        * '='
  3509.  
  3510.     move.w    #34*2,(a4)+    * 配列初期化 statement $$$
  3511.     move.w    d3,(a4)+    * 中間言語書き込み : 型
  3512.     move.w    d2,(a4)+    * 中間言語書き込み : 配列番号
  3513.  
  3514.     movea.l    a4,a3        * (初期化データの個数 - 1) を書き込むアドレス
  3515.     addq.l    #2,a4
  3516.  
  3517.     bsr    first_check_a5_in_line
  3518.     cmpi.b    #'{',d0
  3519.     bne    dim_mis
  3520.  
  3521.     moveq    #0,d2        * データ個数
  3522.  
  3523.  
  3524. did_loop:
  3525.     addq.l    #1,a5
  3526.     bsr    first_check_a5_remark
  3527.  
  3528.     cmpi.b    #1,d3
  3529.     bne    did_not_str
  3530.  
  3531.  
  3532. *did_str:
  3533.     cmpi.b    #'"',(a5)+
  3534.     bne    dim_mis
  3535. did_str_loop:
  3536.     move.b    (a5)+,d0    * 文字列定数 get!
  3537.     beq    dim_mis
  3538.     cmpi.b    #'"',d0
  3539.     beq    @f
  3540.     move.b    d0,(a4)+
  3541.     bra    did_str_loop
  3542. @@:
  3543.     clr.b    (a4)+
  3544.     bra    did_cont
  3545.  
  3546.  
  3547. did_not_str:
  3548.     tst.b    d3
  3549.     beq    did_int
  3550.     bmi    did_float
  3551. *did_char:
  3552.     bsr    int定数get
  3553.     move.b    d0,(a4)+
  3554.     bra    did_cont
  3555. did_float:
  3556.     movem.w    d1/d2/d3,-(sp)
  3557.     movea.l    a5,a0
  3558.     FPACK    __VAL
  3559.     movea.l    a0,a5
  3560.     cmpi.b    #'#',(a5)    * 応急処置(末尾の '#' を無視)
  3561.     bne    @f
  3562.     addq.l    #1,a5
  3563. @@:
  3564.     move.l    d0,(a4)+
  3565.     move.l    d1,(a4)+
  3566.     movem.w    (sp)+,d1/d2/d3
  3567.     bra    did_cont
  3568. did_int:
  3569.     bsr    int定数get
  3570.     move.l    d0,(a4)+
  3571.  
  3572.  
  3573. did_cont:
  3574.     addq.w    #1,d2
  3575.  
  3576.     bsr    first_check_a5_remark
  3577.     cmpi.b    #',',d0
  3578.     beq    did_loop
  3579.     cmpi.b    #'}',(a5)+
  3580.     bne    dim_mis
  3581.  
  3582.  * 配列初期化データ列が終わった
  3583.     subq.w    #1,d2
  3584.     bcs    dim_mis
  3585.  
  3586.     cmp.w    d1,d2        * まさか要素数より多い?
  3587.     bhi    dim_mis
  3588.     move.w    d2,(a3)        * 初期化データの個数
  3589.  
  3590.     move.l    a4,d0
  3591.     addq.l    #1,d0
  3592.     bclr    #0,d0
  3593.     movea.l    d0,a4        * ワード境界に補正 (str用)
  3594.  
  3595.     rts
  3596.  
  3597.  
  3598.  
  3599.  
  3600.  
  3601.  
  3602. var_def_err0:        * hash値を計算する前はここ (H8/2/1)
  3603.     ERROR    5    * 宣言がおかしい
  3604. var_def_err:
  3605.     ERRORS    5    * 宣言がおかしい
  3606. var_double_def_err:
  3607.     ERRORS    6    * 二重に宣言するなんて
  3608. no_soeji:
  3609.     ERROR    35
  3610. dim_mis:
  3611.     ERROR    36
  3612. dim_ten_err:
  3613.     ERROR    60
  3614. 可変長配列は使えへん:
  3615.     ERROR    84
  3616. global可変長配列は使えへんねん:
  3617.     ERROR    85
  3618.  
  3619.  
  3620.  
  3621.  
  3622.  
  3623.     .end
  3624.  
  3625.